Заполнение кортежа элементами в другом кортеже

В шаблоне, как показано ниже, как я могу заполнить кортеж из элементов в другом более сложном кортеже?

template<typename... Ts>
struct foo {
std::tuple<std::vector<Ts>...> tuple;

foo() {
//populate tuple somehow
//assume that no vector is empty
}

void func() {
std::tuple<Ts...> back_tuple; // = ...
//want to populate with the last elements ".back()" of each vector
//how?
}
};

Я не могу найти какой-либо механизм push_back для кортежей, поэтому я не уверен, как использовать для этого трюки с зацикливанием шаблонов. Кроме того, я не могу найти шаблон initializer_list для разных типов, чтобы собрать мои значения и затем передать их в новый кортеж. Есть идеи?

0

Решение

Попробуйте что-то вроде этого:

std::tuple<std::vector<Ts>...> t;

template <int...> struct Indices {};
template <bool> struct BoolType {};

template <int ...I>
std::tuple<Ts...> back_tuple_aux(BoolType<true>, Indices<I...>)
{
return std::make_tuple(std::get<I>(t).back()...);  // !!
}

template <int ...I>
std::tuple<Ts...> back_tuple_aux(BoolType<false>, Indices<I...>)
{
return back_tuple_aux(BoolType<sizeof...(I) + 1 == sizeof...(Ts)>(),
Indices<I..., sizeof...(I)>());
};

std::tuple<Ts...> back_tuple()
{
return back_tuple_aux(BoolType<0 == sizeof...(Ts)>(), Indices<>());
}

(Магия происходит в строке, отмеченной !!.)

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector