如何迭代boost :: variant ,std :: vector >?
问题描述:
作为标题是相当说明性的,如何迭代boost::variant<std::vector<int>, std::vector<string>>
变量的最佳方法?如何迭代boost :: variant <std :: vector <int>,std :: vector <String>>?
说,我有一个结构:
struct foobar{
enum typeOfVariant {intVariant, StringVariant}
boost::variant<std::vector<int>, std::vector<String>> variable;
}
,我接受在某一点与保证该枚举corelated从变异类型。
为了实现也许是这样的:
boost::variant<std::vector<int>, std::vector<string>> var;
for (auto t in var)
{
//do something
}
^这可能是理想的方式。
或者强制转换为std::vector<int>
或std::vector<string>
,基于枚举类型?
答
在C++ 14:
apply_visitor(var, [&](auto&& var){
for(auto&& t : var) {
// code goes here
}
});
没有必要为enum
。变体知道他们自己有什么类型。
A variant
是联合和联合中正确类型的索引。该指数基本上是您的enum
。
我们可以通过一个if
块和两个版本在外部执行,每个版本都假设内容是一种类型或另一种类型,或者类似,但是会增加批量,很少增加值。
大多数名义上的C++ 11编译器可以处理上述问题。没有它,你必须手动编写一个函数对象类来复制它,或者你可以使用“有条件转换”并且写入循环两次,每种类型一次。
我能说什么,C++ 14解决了问题。
'std :: visit'有什么问题? – Yakk
@Yakk它没有提升?根据文档,Boost的版本(名为'apply_visitor')还需要'result_type' typedef,除非你是C++ 14。 –
** - 1 **呈现的代码是**而不是真实代码**,例如缺少分号。另外“枚举与变体类型相关联”。是没有意义的:一个类型不能与动态值相关联。除了所有误导性的东西,问题只是如何访问'boost :: variant',**文档**显示了这一点。 –