重要的!
现有答案暗示所有函数参数类型都是相同的,只是参数的数量不同。
return func(args[I]...)
由于每个参数都必须转换为特定类型,因此无法从解决方案中使用
问题
我有两种定义明确的类型:
class Dest;
class A;
我有一个safe_vector
模板类,它std::vector
带有一个safevalue(i)
函数,如果 i 超出范围,则返回默认构造值。
我有一个模板函数,它从 A 类型的参数返回 T 类型。
template<typename T>
T factory(A a);
现在我有一组任意函数:
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);
我需要将这些函数作为回调函数类型:
void * (Dest * dest, const std::safe_vector<A> & args)
例如:
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)) );
});
是否有任何方法可以使用可变参数模板函数来自动从函数签名中推断出参数列表,并正确地展开参数?
我有一些想法,但它们暗示递归 lambda 函数,这将是运行时递归的,这很难看
上下文
A 是脚本语言的变体类型。该脚本语言的某些功能与 C++ 功能挂钩。工厂函数只是将变体类型转换为所需的 C++ 类。有很多函数要挂钩,因此需要一个干净的、可变的参数模板来完成这项工作。目前 C++ 回调将变量数组作为参数并在内部提取/转换值,这使得它们的可读性很差。