Поскольку вы используете C ++ 11 (и вы знаете тип кортежа из параметра шаблона), вы можете с радостью использовать шаблоны с переменным числом аргументов. Что-то вроде *
template <class ... Ts>
std::tuple<Ts...> convert_to(const Variant& v)
{
Variant tmp_array[std::tuple_size<std::tuple<Ts...>>::value];
get_tuple(v, tmp_array, sizeof(tmp_array)/sizeof(tmp_array[0]));
std::tuple<Ts...> ret;
array_to_tuple(ret, tmp_array);
return ret;
}
, где array_to_tuple
скопирует элементы один за другим:
template <class ... Ts>
struct array_to_tupler
{
template <int I>
static void do_it(std::tuple<Ts...> &t, Variant* vs)
{
std::get<I-1>(t) = convert_to<decltype(std::get<I-1>(t))>(vs[I-1]);
do_it<I-1>(t, vs);
}
template <>
static void do_it<0>(std::tuple<Ts...> &t, Variant* vs)
{
}
};
template <int N, class ... Ts>
void array_to_tuple(std::tuple<Ts...> &t, Variant (&vs)[N])
{
array_to_tupler<Ts...>::do_it<N>(t, vs);
}
Надеюсь, это сработает ...
*) Обратите внимание, что такой convert_to
будет нелегко вызвать. Я предлагаю выполнить специализацию для возвращаемых типов с помощью шаблонов классов, потому что вам нужна частичная специализация, которую не может иметь шаблон функции.