конкатенация значений в цикле while неверна - PullRequest
1 голос
/ 15 декабря 2010

У меня есть boost::variant, который содержит различные типы, и у меня есть строка, которая должна выглядеть следующим образом: type = D, S .Значения в варианте - D и S соответственно, ключ - «тип».Это map<std::string, std::vector<variant> >, где я сейчас перебираю vector<variant> part

. Теперь я сначала применяю 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 в части значения моей исходной пары ключ / значение?

1 Ответ

4 голосов
/ 15 декабря 2010

Проблема может быть в том, что, хотя v_accumulator является членом класса, boost::bind копирует свои аргументы по умолчанию. Это означает, что ConcatValues вызывается для копии helper с собственным вектором v_accumulator.

Если вы хотите ссылку, вы должны использовать boost::ref:

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