Как я могу подделать шаблоны виртуальных переменных функций в C ++?

Следующий код невозможен:

struct poly_base {
template <typename... ARGS>
virtual void operator()(ARGS&&... args) = 0;
};

template <typename DATA>
struct poly_derived : public poly_base {
DATA data;
template <typename... ARGS>
void operator()(ARGS&&... args) override {
data(std::forward<ARGS>(args)...);
}
};

Каким образом я могу подделать такую ​​функциональность, не полагаясь на динамический полиморфизм, предоставляемый виртуальными функциями? Самое главное, как я могу сделать это, не ограничивая типы аргументов, принимаемых operator()кроме тех, которые поддерживаются пересечением всех DATA?

Если комбинации ARGS&&... необходимые были известны заранее, я бы сохранил необходимые указатели функций в poly_baseили объявите необходимые чисто виртуальные функции. Но как я могу сделать это, не ограничивая типы аргументов?

Если бы это было возможно, я ожидал, что компилятор сгенерирует vtable с объединением всех poly_base::operator() перегрузки, вызываемые во всех единицах перевода для каждого DATA с которым poly_derived создается экземпляр. Как мне самому подделать такую ​​вещь, используя шаблоны с переменными значениями, указатели функций и переменные шаблонов?

Уточнение: я не хочу стирать ARGS, Они должны быть известны вызывающей стороне и вызываемой стороне. Я только хочу стереть DATA,

2

Решение

Ответ прост. Вы не

Набор аргументов, поддерживаемый одним типом в C ++, является Halt-полным; Вы не могли бы даже сделать это для не замужем DATA введите, где вы печатаете, стереть все допустимые аргументы в известной таблице

Кроме того, набор типов, производных от класса, нигде не доступен с динамическим связыванием, он даже не известен во время соединения.

0

Другие решения

использование C Variadic Args может исправить ABI проблема, но я не знаю, можно ли это использовать с ключевым словом virtual,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector