Итак, у меня есть тип 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
}
Причина, по которой он не работает, заключается в том, что вы не можете индексировать такие аргументы во время выполнения.
Каков наилучший метод для замены средней части 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 по значению, а не как параметр out, поэтому мне даже не нужно fv выше)