ca*************@gmail.com wrote:

hello,

imagine you have a static class method that receives a function

pointer, an int with the number of arguments and a variable number of

arguments.

in that static method you want to call that function (using its

pointer) and call it with the same argument list that was passed into

the static method.

sorry the bad explanation, maybe the code will make it clearer:

#include <iostream>

#include <stdarg.h>

//just a function to sum a variable number of integers

int Sum(int num, ...)

{

int res = 0;

va_list arguments;

va_start(arguments, num);

for(int i = 0; i < num; i++)

{

res += va_arg(arguments, int);

}

return res;

}

//just a function to sub a variable number of integers

int Sub(int num, ...)

{

int res = 0;

va_list arguments;

va_start(arguments, num);

for(int i = 0; i < num; i++)

{

res -= va_arg(arguments, int);

}

return res;

}

class Operation

{

public:

static int Calc(int (*op)(int num, ...), int num, ...)

{

//here is where the problem exists, how can i pass that argument

list to the op function?

return (*op)(num, ...);//ofc this gives me a syntax error.

}

};

int main(int argc, char *argv[])

{

//usage example

std::cout << Operation::Calc(Sum, 3, 1, 2, 3) << std::endl;//should

print 6 (1+2+3)

return 0;

}

thanks in advance :)

Mmmhhh ... I remember reading somewhere in this list, not a long time

ago that it was not possible with the current C++ standard ...

I think the common work-around is to use a macro that defines the

function with different number of parameters. You can have a look at

Boost.Function (

http://www.boost.org/doc/html/function.html). But the

idea is to have in the end something like that:

template <class R>

R calc( R(*op)() )

{

return op();

}

template <class R, class Arg1>

R calc( R (*op)(Arg1), Arg1 value )

{

return op(value);

}

template <class R, class Arg1, class Arg2>

R calc( R (*op)(Arg1,Arg2), Arg1 value1, Arg2 value2)

{

return op(value1, value2);

}

....

But IRC, it is a bit more complex if you want to handle reference types

(in that case, better use Boost.Function !!)

Pierre