使用可变模板解包参数列表 我试图在一个使用不透明数据类型的旧C-API周围创建C++便利包装。有一个特殊的C函数,它接受一个格式字符串,以及使用C工具的数量可变的参数。作为我的包装器的一部分,我希望能够将任意数量的参数(包括C++对象)传递给这个函数。但是,由于代码> /COD>设施不能使用非POD数据,所以我创建了一个模板转换函数,它将C++对象(如 STD::String < /代码>)转换成POD等价物。

使用可变模板解包参数列表 我试图在一个使用不透明数据类型的旧C-API周围创建C++便利包装。有一个特殊的C函数,它接受一个格式字符串,以及使用C工具的数量可变的参数。作为我的包装器的一部分,我希望能够将任意数量的参数(包括C++对象)传递给这个函数。但是,由于代码> /COD>设施不能使用非POD数据,所以我创建了一个模板转换函数,它将C++对象(如 STD::String < /代码>)转换成POD等价物。,c++,c++11,variadic-functions,C++,C++11,Variadic Functions,我原以为使用C++0x可变模板可以轻松完成整个过程,但我很难弄清楚如何编写此函数,以便在将转换函数应用于每个参数时正确展开参数包 到目前为止,我得到的是: template <class T, class... Args> void apply(OPAQUE* object, const char* fmt_string, T&& val, Args&&... args) { apply(object, fmt_strin

我原以为使用C++0x可变模板可以轻松完成整个过程,但我很难弄清楚如何编写此函数,以便在将转换函数应用于每个参数时正确展开参数包

到目前为止,我得到的是:

   template <class T, class... Args>
   void apply(OPAQUE* object, const char* fmt_string, T&& val, Args&&... args)
   {
      apply(object, fmt_string, Convert(val), args...);
   }

   template <class... Args>
   void apply(OPAQUE* object, const char* fmt_string, Args&&... args)
   {
      C_API_Function_Call(object, fmt_string, args...);
   }
模板
void apply(不透明*对象、常量字符*fmt_字符串、T&&val、Args&&…Args)
{
应用(对象、fmt_字符串、转换(val)、参数;
}
模板
void apply(不透明*对象、常量字符*fmt_字符串、Args&…Args)
{
C_API_函数_调用(对象、fmt_字符串、参数…);
}
当然,这不起作用,因为递归函数调用实际上从未解压缩
Args…
,所以它只是递归,直到堆栈溢出。我不知道如何在将当前参数传递给
Convert
函数,然后递归传递结果的同时解压参数


还有什么方法可以做到这一点吗?

目前C++0x草案没有提供任何解决方案。因为问题类似于扩展元组,所以您可以读取和写入类似的扩展函数。

我认为您需要与执行完美转发时相同的语法:

template <class... Args>
void apply(OPAQUE* object, const char* fmt_string, Args&&... args)
{
   C_API_Function_Call(object, fmt_string, Convert(std::forward<Arg>(args))...);
}
模板
void apply(不透明*对象、常量字符*fmt_字符串、Args&…Args)
{
C_API_函数_调用(对象、fmt_字符串、转换(std::forward(args))…);
}
省略号。。。可以放在包含参数包的表达式的右侧,而不仅仅是直接放在参数包本身的右侧

所以,:
func(args…)扩展到func(arg1,arg2,arg3,[…],argN)

func(args)。。。扩展到func(arg1),func(arg2),[…],func(argN)

不知道为什么OP还没有改变他的观点并接受这个答案。目前被接受的答案显然是错误的,而你的答案是正确的+1干杯。