【发布时间】:2012-08-15 08:42:32
【问题描述】:
所以我有一些类型X:
typedef ... X;
还有一个模板函数f:
class <typename T>
void f(X& x_out, const T& arg_in);
然后是一个函数g:
void g(const X* x_array, size_t x_array_size);
我需要编写一个可变参数模板函数h 来执行此操作:
template<typename... Args>
void h(Args... args)
{
constexpr size_t nargs = sizeof...(args); // get number of args
X x_array[nargs]; // create X array of that size
for (int i = 0; i < nargs; i++) // foreach arg
f(x_array[i], args[i]); // call f (doesn't work)
g(x_array, nargs); // call g with x_array
}
它不起作用的原因是因为你不能在运行时像这样下标 args。
替换h中间部分的最佳技术是什么?
获胜者是 Xeo:
template<class T> X fv(const T& t) { X x; f(x,t); return x; }
template<class... Args>
void h(Args... args)
{
X x_array[] = { fv(args)... };
g(x_array, sizeof...(Args));
}
(实际上在我的具体情况下,我可以重写 f 以按值返回 x 而不是作为输出参数,所以我什至不需要上面的 fv)
【问题讨论】:
-
args不是一个数组——你期待什么? -
@KerrekSB:当然。我没想到它会起作用,只是用它作为伪代码来描述问题。
-
由于您使用的是 C++11,您不能让
h获取一个初始化列表并使用向量而不是数组吗? -
@jrok:h 的参数类型是异构的。我认为 initializer_list 是针对同质参数的。
标签: c++ templates c++11 variadic-templates