1

我有一个boost::variant,其中包含各种类型,我有一个字符串,它需要看起来像这样:type=D,S。变体中的值分别是 D 和 S,键是 'type'。这是map<std::string, std::vector<variant> >我现在正在迭代该vector<variant>部分的地方

现在我首先将 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

1 回答 1

4

问题可能在于,虽然v_accumulator是类成员,但boost::bind默认情况下会复制其参数。这意味着在 的副本ConcatValues调用,具有自己的向量。helperv_accumulator

如果你想要一个参考,你必须使用boost::ref

boost::apply_visitor(add_node_value_visitor(
    boost::bind(&SerializerHelper::ConcatValues, boost::ref(helper), _1, _2), key, result), var);
于 2010-12-15T09:54:31.820 回答