Я не уверен, что вам понадобятся вариады для этого. Рассмотрим следующий интерфейс ...
template < typename RETURN_TYPE >
class iFunctor abstract {
public:
virtual RETURN_TYPE operator () ( void ) = 0;
};
Абстрактные интерфейсы не являются полноценными классами, они могут содержать частичную реализацию, такую как сигнатуры функций и некоторые члены данных. С помощью шаблона вы можете обобщить тип возвращаемого значения. Но как насчет списка аргументов, который вы говорите?
Обратите внимание, что в интерфейсе нет конструктора. В вашем конкретном классе (или производных классах) вы можете передать бремя переменных списков аргументов конструктору, например так ...
template < typename TYPE >
class ConcreteFunctor_add : public iFunctor < TYPE > {
private:
int A;
int B;
public:
explicit ConcreteFunctor_add ( const int &a, const int &b ) : A(a), B(b) {};
TYPE operator () ( void ) { return ( A + B ); };
};
Вы имеете дело со списком аргументов в каждом конкретном случае через конструктор.
Для явного конструктора требуется список аргументов при объявлении, поэтому вы получите список переменных здесь. Так на практике ...
ConcreteFunctor_add < int > addInteger ( 10, 10 );
addInteger();
... и ты будешь крут.