Следующий код невозможен:
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
,
Ответ прост. Вы не
Набор аргументов, поддерживаемый одним типом в C ++, является Halt-полным; Вы не могли бы даже сделать это для не замужем DATA
введите, где вы печатаете, стереть все допустимые аргументы в известной таблице
Кроме того, набор типов, производных от класса, нигде не доступен с динамическим связыванием, он даже не известен во время соединения.
использование C
Variadic Args может исправить ABI
проблема, но я не знаю, можно ли это использовать с ключевым словом virtual
,