【问题标题】:How to iterate over boost::variant<std::vector<int>, std::vector<String>>?如何迭代boost :: variant <std :: vector <int>,std :: vector <string >>?
【发布时间】:2017-02-01 18:15:11
【问题描述】:

由于标题非常具有解释性,那么迭代 boost::variant&lt;std::vector&lt;int&gt;, std::vector&lt;string&gt;&gt; 变量的最佳方法是什么?

说我有一个结构:

struct foobar{
    enum typeOfVariant {intVariant, StringVariant}
    boost::variant<std::vector<int>, std::vector<String>> variable;
    }

我在某个时刻收到的保证枚举与变体中的类型相关。

实现可能是这样的:

boost::variant<std::vector<int>, std::vector<string>> var;

for (auto t in var)
{
//do something
}

^这可能是理想的方式。

或者根据枚举类型强制转换为std::vector&lt;int&gt;std::vector&lt;string&gt;

【问题讨论】:

  • std::visit 有什么问题?
  • @Yakk 不是在提升吗?根据文档,Boost 的版本(名为 apply_visitor)还需要 result_type typedef,除非您是 C++14。
  • −1 呈现的代码不是真正的代码,例如缺少分号。此外,“枚举与变体中的类型相关。”是没有意义的:一个类型不能与一个动态值相关联。除去所有误导性的东西,问题只是如何访问 boost::variant 所持有的内容,documentation 显示了这一点。'

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


【解决方案1】:

在 C++14 中:

apply_visitor( var, [&](auto&& var){
  for( auto&& t : var ) {
    // code goes here
  }
});

不需要enum。变体知道它们自己的类型。

variant 是一个联合,也是联合中正确类型的索引。该索引基本上是您的enum

我们可以在外部使用 if 块和两个版本来实现,每个版本都假定内容是一种或另一种或类似的类型,但这会增加体积,很少增加价值。

大多数名义上的 C++11 编译器都可以处理上述问题。如果没有它,您必须手动编写一个复制它的函数对象类,或者您可以使用“条件强制转换”并编写两次循环,每种类型一个。

我能说什么,C++14 解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2014-01-11
    • 2014-11-08
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多