C++ 根据包含的类型检索向量的向量
我正在开发一个小型的3D引擎,我想知道如何避免每次通过我的整个层次结构(模型、灯光)来访问灯光、材质等 我决定创建一个单例数据提供者,保留所有列表、指向材质的指针列表或指向灯光的指针列表,以及任何类型的列表 但是,我的代码看起来太麻烦了,每次我必须添加一个新列表,我必须将它添加到类属性中 我最终决定做如下事情:C++ 根据包含的类型检索向量的向量,c++,templates,boost,C++,Templates,Boost,我正在开发一个小型的3D引擎,我想知道如何避免每次通过我的整个层次结构(模型、灯光)来访问灯光、材质等 我决定创建一个单例数据提供者,保留所有列表、指向材质的指针列表或指向灯光的指针列表,以及任何类型的列表 但是,我的代码看起来太麻烦了,每次我必须添加一个新列表,我必须将它添加到类属性中 我最终决定做如下事情: class DataProvider { public: using DataListContainer = std::vector<std::vector<bo
class DataProvider
{
public:
using DataListContainer = std::vector<std::vector<boost::any>>;
...
private:
DataListContainer data_;
template <typename ... Ts>
class DataProviderT
{
public:
using DataListContainer = std::tuple<std::vector<Ts>...>;
template <typename T>
std::vector<T>& GetVector() { return std::get<std::vector<T>>(data_); }
private:
DataListContainer data_;
};
using DataProvider = DataProviderT<Model, Light>;
类数据提供程序
{
公众:
使用DataListContainer=std::vector;
...
私人:
DataListContainer数据;
我要讨论的问题是根据给定的类型得到内部向量?这里的整个过程看起来很混乱。
除此之外,使用boost::any
类型并不能真正保证内部向量中的类型是唯一的,它可能是混合的。
存储向量的正确方法是什么,根据向量存储的类型检索内部向量?如果我正确理解您的要求,您可以使用以下方法:
class DataProvider
{
public:
using DataListContainer = std::vector<std::vector<boost::any>>;
...
private:
DataListContainer data_;
template <typename ... Ts>
class DataProviderT
{
public:
using DataListContainer = std::tuple<std::vector<Ts>...>;
template <typename T>
std::vector<T>& GetVector() { return std::get<std::vector<T>>(data_); }
private:
DataListContainer data_;
};
using DataProvider = DataProviderT<Model, Light>;
模板
类DataProviderT
{
公众:
使用DataListContainer=std::tuple;
模板
std::vector&GetVector(){return std::get(data)}
私人:
DataListContainer数据;
};
使用DataProvider=DataProviderT;
如果我正确理解您的需求,您可以使用以下内容:
class DataProvider
{
public:
using DataListContainer = std::vector<std::vector<boost::any>>;
...
private:
DataListContainer data_;
template <typename ... Ts>
class DataProviderT
{
public:
using DataListContainer = std::tuple<std::vector<Ts>...>;
template <typename T>
std::vector<T>& GetVector() { return std::get<std::vector<T>>(data_); }
private:
DataListContainer data_;
};
using DataProvider = DataProviderT<Model, Light>;
模板
类DataProviderT
{
公众:
使用DataListContainer=std::tuple;
模板
std::vector&GetVector(){return std::get(data)}
私人:
DataListContainer数据;
};
使用DataProvider=DataProviderT;
考虑一个。@nwp:它只允许一个单一类型的容器(除非您的示例中的T
是某种复合容器)。似乎OP需要一个异类容器,如tuple
@AndyG。它允许任意数量的类型。@nwp:但只能用一种类型实例化它。每个类型需要一个不同的向量。OP需要一个包含许多类型的容器,而vector不能这样做。我不想实例化它,提供程序将是一个s考虑到一个.nWP:它只允许一个容器类型(除非在例子中<代码> t>代码>是复合的)。。似乎OP需要一个异类容器,如tuple
@AndyG。它允许任意数量的类型。@nwp:但只能用一种类型实例化它。每个类型需要一个不同的向量。OP需要一个包含许多类型的容器,而vector不能这样做。我不想实例化它,提供程序将是一个s英格尔顿。我没有想到这一点。唯一的问题是,它仍然是侵入式的方式,我必须更新模板。但无论如何,这仍然是一个更好的解决方案!我没有想到这一个。唯一的问题是,它仍然是侵入式的方式,我必须更新模板。但无论如何,这仍然是一个更好的解决方案!