我如何 select 元组类型的子集并从该子集的内容创建另一个元组?

How can I select a subset of tuple types and create another tuple from contents of the subset?

我有一个使用可变参数定义的结构元组:

#include <tuple>
#include <vector>

template<class Type>
struct Pool {
  std::vector<Type> components;
};

template<class... Types>
class Storage {
public:
  std::tuple<Pool<Types>...> pools;

  template<class SelectedType0, class... SelectedTypes>
  std::tuple<std::vector<SelectedTypes>&...> getVectorsFromTuple();

  template<class... SelectedTypes>
  void iterate();
};

我想要一种从元组中 select 类型子集并创建基于其内容的新元组的方法。本质上,这就是我想要实现的目标:

template<class... Types>
template<class... SelectedTypes>
void Storage<Types...>::iterate() {
  std::tuple<std::vector<SelectedTypes>&...> vectors = getVectorsFromTuple<SelectedTypes...>(pools);
  // getVectorsFromTuple should get the values in the tuple based on types
  // and save reference to each tuple item's structure's `components`
  // property in another tuple 
}

我得到的一个想法是在另一个函数中“定义”第一个模板参数,然后使用该函数递归地定义其他参数:

template <class... Types>
template<class SelectedType0, class... SelectedTypes>
inline std::tuple<std::vector<SelectedType0>&, std::vector<SelectedTypes>&...> EntityStorageSparseSet<ComponentTypes...>::getVectorsFromPools() {
    return std::make_tuple(std::get<PickComponent0>(pools).components, getVectorsFromPools<PickComponents...>());
}

但我不知道如何 unroll/flatten 递归元组所以这个函数 returns 类似于:

std::tuple<SelectedType0, SelectedType1, ...>

而不是

std::tuple<SelectedType0, std::tuple<SelectedType1, std::tuple<SelectedType2, ...>>>

如何展开元组或者是否有更好的方法来实现我想要实现的目标?

以下似乎可以完成这项工作(假设 Types 中的类型是唯一的):

template <typename... Types>
template <typename... SelectedTypes>
std::tuple<std::vector<SelectedTypes>&...>
EntityStorageSparseSet<Types...>::getVectorsFromPools()
{
    return { std::get<SelectedTypes>(pools).components... };
}