用另一个元组中的元素填充一个元组

Populating a tuple with elements in another tuple

本文关键字:元组 一个 元素 另一个 填充      更新时间:2023-10-16

在下面这样的模板中,如何从另一个更复杂的元组中的元素填充元组?

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的模板来收集我的值,然后传递到新的元组中。有什么想法吗?

试试这样的东西:

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<>());
}

(魔术发生在标记为!!的行中。)