2010-12-15 51 views
1

我有一個boost::variant,它包含各種類型,我有一個字符串需要看起來像這樣:type = D,S。變體中的值分別是D和S,關鍵是'type'。這是一個map<std::string, std::vector<variant> >在那裏我現在迭代vector<variant>部分在while循環出錯的情況下連接值

現在我先申請一個static_visitor我的變種做了相應的轉換,在這種情況下可能並不需要,但對於其他類型的就需要轉換成串。

然後我稱這個函數爲ConcatValues,它是輔助類的一部分。這個類定義了一個vector<string> v_accumulator來保存臨時結果,因爲這個函數可能會在while循環中多次調用,並且我想以逗號分隔的值列表結束。

但問題是我的矢量v_accumulator在每個函數調用中總是空的?這是什麼意思,因爲它是一個類變量。

while(variant_values_iterator != values.end()) 
{ 
      variant var = *variant_values_iterator; 
     boost::apply_visitor(add_node_value_visitor(boost::bind(&SerializerHelper::ConcatValues, helper, _1, _2), key, result), var); 
     variant_values_iterator++; 
} 



std::string SerializerHelper::ConcatValues(std::string str, std::string key) 
{ 
    v_accumulator.push_back(str); //the previous value is not in this vector??? 
    std::stringstream ss; 
    std::vector<std::string>::iterator it = v_accumulator.begin(); 

    ss << key; 
    ss << "="; 

    for(;it != v_accumulator.end(); it++) 
    { 
     ss << *it; 
     if (*it == v_accumulator.back()) 
      break; 
     ss << ","; 
    } 

    return ss.str(); 

} 


class SerializerHelper 
{ 
public: 
    std::string ConcatValues(std::string str, std::string key); 

private: 
    std::vector<std::string> v_accumulator; 
}; 

也許有是連接在我原來的鍵/值對的值部分d,S的值更簡單的方法?

回答

4

問題可能是,雖然v_accumulator是類成員,但boost::bind默認複製其參數。這意味着在helper拷貝上調用ConcatValues,其具有其自己的v_accumulator載體。

如果你想要一個參考,則必須使用boost::ref

boost::apply_visitor(add_node_value_visitor(
    boost::bind(&SerializerHelper::ConcatValues, boost::ref(helper), _1, _2), key, result), var); 
+0

1,或者,可以通過指針的結合成員功能的情況下通過的第一個參數。 'bind'模板會正確處理它:'boost :: bind(&SerializerHelper :: ConcatValues,&helper,_1,_2)'。 – 2010-12-15 10:30:48

相關問題