【问题标题】:vector of vector with different types具有不同类型的向量的向量
【发布时间】:2018-05-05 09:08:44
【问题描述】:

我想构造一个向量的向量。这个问题已经在 SO 上发布了很多次,但我没有找到令人满意的答案。那是因为:

  • 每个向量可以有不同的类型
  • 编译时不知道类型
  • 我不知道它会包含多少个向量

基本上我希望能够在伪代码中做类似的事情 稍后

types = ["char", "int", "double", "int"]
container<vector> x

foreach (type in types)
{
  if (type == "char")
    x.push_back(vector<char>)
  else if (type == "int")
    x.push_back(vector<int>)
  else
    x.push_back(vector<double>)
}

然后我希望能够做到例如

x[0].push_back("a")
x[1].push_back(1)
x[2].push_back(3.1416)

我认为boost::any 可能对我有帮助,但我还不熟悉 boost。

重点是,即使听起来很奇怪,这也是我真正想做的事情。我不想要一个结构向量,我真的想要一个包含不同类型的std::vector 的容器(无论是哪一个)。原因是因为我正在读取二进制文件。文件的标题说明了数据的数量及其类型,但它可以从一个文件更改为另一个文件。因此在编译时无法知道。

【问题讨论】:

  • i不是编译时常量表达式时,静态类型语言应该如何解析x[i].push_back(...);
  • 使用boost/std::variant
  • @geza:如果 OP 在编译时不知道类型,则变体将无济于事。 any 会更好,但这有点设计缺陷的味道。
  • @AndyG:我认为他知道可能的类型,他只是不知道给定向量的类型。
  • @AndyG 但它闻起来有设计错误的味道。这就是为什么我对这个问题感到尴尬......

标签: c++ c++11 vector boost stl


【解决方案1】:

也许您可以使用变体向量?

using ints = std::vector<int>;
using chars = std::vector<char>;
using doubles = std::vector<double>;
using mixed_data_t = std::vector<std::variant<chars, ints, doubles>>;

如果每个文件都有相同类型的数据,您可以在运行时找出它是什么,然后推回到适当的变体向量中。

如果文件有混合数据,那么你可以使用

std::vector<std::vector<std::variant<char, int, double>>>;

但您必须检查每次插入。

我相当有信心 boost::any 不是您正在寻找的解决方案,因为每次插入后类型信息都会丢失。

【讨论】:

  • 重点是文件是标准化的,但可以有额外的免费数据。标题清楚地说明了它包含的内容,但在编译时我不知道。只有一次我阅读了标题。
  • @JRR 变体的类型在运行时决定。运行时类型可以在作为模板参数发送的类型之间有所不同。
  • 确保您有c++17 支持。
  • 是否有不需要 c++17 的 boost 等价物?
  • 可以使用 boost::variant 或 egg::variant。
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 2012-08-17
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
相关资源
最近更新 更多