Итак, у меня есть тип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
?
И победителем становится Ксео:
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 выше)