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

Posted

技术标签:

【中文标题】根据包含的类型检索向量的向量【英文标题】:Retrieve vector of vector according to contained type 【发布时间】:2016-06-24 19:13:55 【问题描述】:

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

我决定创建一个单例 DataProvider,保留所有列表、指向材质的指针列表或指向灯光的指针列表、任何类型的列表。

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

我终于决定做这样的事情:

class DataProvider

  public:
    using DataListContainer = std::vector<std::vector<boost::any>>;
    ...
private:
   DataListContainer data_;

我要解决的问题是根据给定类型获取内部向量?这里的整个过程似乎很混乱。 除此之外,使用boost::any 类型并不能真正保证内部向量内的类型是唯一的,它可能是混合的。 存储向量向量的正确方法是什么,根据它们存储的类型检索内部向量?

【问题讨论】:

考虑template <class T> std::vector<T> data。 @nwp:不过,这只允许单一类型的容器(除非您的示例中的 T 是某种复合容器)。看来 OP 想要一个异构容器,如 tuple @AndyG 它允许任意数量的类型。 @nwp:不过,它只能用一种类型实例化。每种类型都需要不同的向量。 OP 想要 1 个包含多种类型的容器,而 vector 无法做到这一点。 我不想实例化它,提供者将是一个单身人士。 【参考方案1】:

如果我理解正确你想要什么,你可以使用类似:

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>;

【讨论】:

我没有想过这个。唯一的问题是我必须更新模板的方式仍然是侵入性的。但无论如何,它仍然是一个更好的解决方案!

以上是关于根据包含的类型检索向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个不同大小和类型的向量对点向量进行排序

自定义聚类算法

我有一个 SWIG 包装的向量。我怎么知道它包含哪种类型?

根据用户输入更改箱线图显示 - 闪亮(不能强制类型“闭包”为字符类型的向量)

访问和修改包含具有不同变量类型的对象的 C++ 向量

从向量中检索字符标签