I need to implement a functor that takes any (!) function pointer when instantiated, analyses the argument types, stores the pointer and when operator() is called, does something with the pointer. The easiest case being, calling the function with its arguments.
I tried converting the function pointer to something like std::function and I get the error:
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(*)(...)>’
I am using gcc 4.6.1, compiling with -std=c++0x
This is a minimal example:
#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;
}
This does NOT compile... If I don't declare the constructor as a template but with "F_vararg f" as the argument, and adjust the cast in the instantiation accordingly, it works (should it?) but I have no chance (?) of getting any information on the arguments of func1 in the constructor of the functor which I need.
Am I missing something? Is there another way to do that?
Thank you in advance !!!
cheers, Steffen
edit Wow, that was quick! I need that for postponing the execution of functions. The functor (or another class) should be able to decide whether and when to run a function. To decide that it will use the information gathered from the argument list.
I have looked at std::bind but I couldn't think of a way to achieve what I want...
Foo
. You'll have to encode the argument types in the functor type, something likeFoo<void,double,double,double>
to represent a functor which returns a void and takes three doubles as arguments. – DebbiFoo<void(double,double,double)> x(func1)
andFoo<void(int,int,int)> y(func2)
where func1 and func2 are different functions that take three doubles or three ints respectively. So in this case, x and y are different types; they both come fromFoo
, but they are different types in the same way thatvector<int>
andvector<double>
are. – Debbi