Мне нужно реализовать функтор, который при создании экземпляра принимает любой (!) Указатель на функцию, анализирует типы аргументов, сохраняет указатель и, когда вызывается оператор (), что-то делает с указателем.Самым простым случаем является вызов функции с ее аргументами.
Я попытался преобразовать указатель функции во что-то вроде std :: function, и я получил ошибку:
error: invalid use of incomplete type ‘struct std::function<void (*)(...)>’
/usr/include/c++/4.6/functional:1572:11: error: declaration of ‘struct std::function<void(*)(...)>’
Я использую gcc4.6.1, компиляция с -std = c ++ 0x
Это минимальный пример:
#include <functional>
using namespace std;
typedef void (*F_vararg)(...);
class Foo
{
public:
template<typename... ARGS> Foo(function<F_vararg(ARGS... args)> f);
~Foo(){}
template<typename... ARGS>void operator()(ARGS... args);
private:
F_vararg m_f;
};
template<typename... ARGS>
Foo::Foo(function<F_vararg(ARGS... args)> f)
{
m_f = f;
}
template<typename... ARGS>
void Foo::operator()(ARGS... args)
{
m_f(args...);
}
void func1(double *a1, double *a2, double *b)
{ //do something
}
int main(void)
{
Foo func1_functor((std::function<void (*)(...)>)(func1));
double a1[3] = {2.,3.,4.};
double a2[3] = {2.2,3.2,4.2};
double b[3] = {1.5,2.5,3.5};
func1_functor(a1,a2,b);
return 0;
}
Это НЕ компилируется ... Если я не объявляю конструктор какшаблон, но с "F_vararg f" в качестве аргумента и соответствующим образом отрегулировать приведение в экземпляре, он работает (не так ли?), но у меня нет шансов (?) получить какую-либо информацию об аргументах func1 в конструкторефунктор, который мне нужен.
Я что-то упустил?Есть ли другой способ сделать это?
Заранее спасибо !!!
ура, Штеффен
edit Ого, это было быстро!Мне нужно это для отсрочки выполнения функций.Функтор (или другой класс) должен быть в состоянии решить, следует ли и когда запускать функцию.Чтобы решить, что он будет использовать информацию, собранную из списка аргументов.
Я посмотрел на std :: bind, но не мог придумать, как добиться того, чего я хочу ...