在while循环出错的情况下连接值

问题描述:

我有一个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的值更简单的方法?

问题可能是,虽然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