ОК, это может показаться немного излишним, но как насчет этого: Насколько мне известно, единственная возможность «перебирать» вариады - это использовать запись <head, tail...>
с шаблонной специализацией для простого случая <head-only>
. 1003 *
Поэтому вы можете попробовать что-то вроде этого:
простой случай:
template <typename T>
struct sequences
{
std::tuple<T> get(size_t pos)
{
return values[pos];
}
std::vector<T> get_sequence()
{
return values;
}
std::vector<T> values;
};
рекурсивный случай:
template <typename T, typename ...U>
struct sequences
{
std::tuple<T, std::tuple<U...> > get(size_t pos)
{
return std::make_tuple(values[pos], remainder->get(pos));
}
template <size_t Idx>
std::vector<
typename std::tuple_element<Idx, std::tuple<T...>>::type
> get_sequence()
{
return get_sequence_internal<
typename std::tuple_element<Idx, std::tuple<T...>>::type, Idx
>();
}
template <typename V, 0>
std::vector<V> get_sequence_internal()
{
return values;
}
template <typename V, size_t Idx>
std::vector<V> get_sequence()
{
return remainder->getSequence_internal<V, Idx-1>();
}
std::vector<T> values;
sequences<U...>* remainder;
};
Отказ от ответственности: не проверено, даже не скомпилировано, но я полагаю, вы поняли основную идею. Осталось минимум две проблемы:
- Возвращаемое значение
get()
- это не единственная структура, а цепочка кортежей. Возможно, вы можете отцепить его рекурсивно с помощью std::get<0>
...
- Я не знаю, генерирует ли специализация get_sequence_internal ошибку времени компиляции, поскольку тип
V
может отличаться от T
.