2016-09-23 192 views
0

作为标题是相当说明性的,如何迭代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>,基于枚举类型?

+0

'std :: visit'有什么问题? – Yakk

+0

@Yakk它没有提升?根据文档,Boost的版本(名为'apply_visitor')还需要'result_type' typedef,除非你是C++ 14。 –

+0

** - 1 **呈现的代码是**而不是真实代码**,例如缺少分号。另外“枚举与变体类型相关联”。是没有意义的:一个类型不能与动态值相关联。除了所有误导性的东西,问题只是如何访问'boost :: variant',**文档**显示了这一点。 –

回答

1

在C++ 14:

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

没有必要为enum。变体知道他们自己有什么类型。

A variant是联合和联合中正确类型的索引。该指数基本上是您的enum

我们可以通过一个if块和两个版本在外部执行,每个版本都假设内容是一种类型或另一种类型,或者类似,但是会增加批量,很少增加值。

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

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

相关问题