我如何 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... };
}
我有一个使用可变参数定义的结构元组:
#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... };
}