Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据包含的类型检索向量的向量_C++_Templates_Boost - Fatal编程技术网

C++ 根据包含的类型检索向量的向量

C++ 根据包含的类型检索向量的向量,c++,templates,boost,C++,Templates,Boost,我正在开发一个小型的3D引擎,我想知道如何避免每次通过我的整个层次结构(模型、灯光)来访问灯光、材质等 我决定创建一个单例数据提供者,保留所有列表、指向材质的指针列表或指向灯光的指针列表,以及任何类型的列表 但是,我的代码看起来太麻烦了,每次我必须添加一个新列表,我必须将它添加到类属性中 我最终决定做如下事情: class DataProvider { public: using DataListContainer = std::vector<std::vector<bo

我正在开发一个小型的3D引擎,我想知道如何避免每次通过我的整个层次结构(模型、灯光)来访问灯光、材质等

我决定创建一个单例数据提供者,保留所有列表、指向材质的指针列表或指向灯光的指针列表,以及任何类型的列表

但是,我的代码看起来太麻烦了,每次我必须添加一个新列表,我必须将它添加到类属性中

我最终决定做如下事情:

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英格尔顿。我没有想到这一点。唯一的问题是,它仍然是侵入式的方式,我必须更新模板。但无论如何,这仍然是一个更好的解决方案!我没有想到这一个。唯一的问题是,它仍然是侵入式的方式,我必须更新模板。但无论如何,这仍然是一个更好的解决方案!