Вызов функции для каждого вариативного аргумента шаблона и массива

Итак, у меня есть тип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 выше)

25
задан Lightness Races with Monica 1 May 2013 в 16:48
поделиться