Я хотел бы сохранить в качестве переменной-члена указатель на функцию, которая может принимать переменное число аргументов различных типов.
Базовая конструкция, которую я пытался использовать, выглядит следующим образом
template <typename... Args>
using ArgsFuncPointer = void(*)(Args...);
template<typename... Args> void varArgsFunc(Args&&... args) { }
{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}
Проблема в том, что varArgsFunc
невозможно преобразовать в ArgsFuncPointer<int, float>
См. coliru для (не) рабочего примера.
В конечном итоге я хотел бы иметь возможность сделать что-то вроде:
template <typename... Args> class Foo
{
public:
Foo(Args&&... args)
{
func(args);
}
VarArgsFuncPointer func;
}
UPDATE
Оказывается, причина, по которой он не будет компилироваться, заключается в тонкой разнице в сигнатуре между ArgsFuncPointer
и varArgsFunc
. При ArgsFuncPointer
пакет параметров передается по ссылке rvalue, тогда как при varArgsFunc
пакет параметров передается по значению.
Это работает:
template <typename... Args>
using ArgsFuncPointer = void(*)(Args&&...);
template<typename... Args> void varArgsFunc(Args&&... args) { }
{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}
Рабочий пример здесь