2016-09-23 233 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解決了問題。

相關問題