3

Important!

Existing answers imply that all function parameter types are the same, only the number of parameters varies.

For instance : Any Solution to Unpack a Vector to Function Arguments in C++?

It's not possible to use return func(args[I]...) from the solution since each parameter has to be converted to a specific type

The question

I have two well defined types:

class Dest;
class A;

I have a safe_vector template class that is a std::vector with a safevalue(i) function that returns a default constructed value if i is out of bounds.

I have a template function which returns a type T from an argument of type A.

template<typename T>
T factory(A a);

Now I have a set of arbitrary functions:

void f_a(Dest * dest, T1 a, T2 b, T3 c);
void f_b(Dest * dest, T2 a);
void f_c(Dest * dest, T4 a, T1 b);
void f_d(Dest * dest, T4 a, T1 b, T1 c, T3 d);
void f_e(Dest * dest, T4 a, T1 b);

And I need to give these functions as callback functions of type:

void * (Dest * dest, const std::safe_vector<A> & args)

For instance:

addCallback("f_a", [](Dest * dest, const std::safe_vector<A> & args)
                {
                    f_a(dest,
                        factory<T1>(args.safe_value(0)),
                        factory<T2>(args.safe_value(1)),
                        factory<T3>(args.safe_value(2))   );
                });

Is there any method of doing this with a variadic template function that will automatically deduce the argument list from the function signature, and properly do the argument unroll?

I have some ideas but they imply recursive lambda functions, which will be runtime recursive and that's ugly

The context

A is a variant type from a scripting language. Some function of that scripting language are hooked to C++ functions. The factory function just converts the variant type to the required C++ classes. There are a lot of functions to hook, hence the need for a clean, variable argument template to do the job. Currently C++ callbacks take the variant array as a parameter and extract/convert the values internally, which makes them poorly readable.

galinette
  • 8,896
  • 2
  • 36
  • 87

0 Answers0