2010-12-15 5 views
1

Ich habe eine boost::variant, die verschiedene Typen enthält und ich habe eine Zeichenfolge, die so aussehen muss: type = D, S. Die Werte in der Variante sind D bzw. S, der Schlüssel ist "Typ". Es ist ein map<std::string, std::vector<variant> >, wo ich jetzt die vector<variant> Teilverketten Werte in einer While-Schleife falsch gegangen

Iterieren jetzt zuerst einen statischen_visitor auf meine Variante, um die entsprechende Konvertierung, die in diesem Fall möglicherweise nicht erforderlich ist, aber für andere Art würde es Umwandlung in eine benötigen Zeichenfolge.

Dann nenne ich diese Funktion ConcatValues genannt, Teil einer Helferklasse. Diese Klasse hat eine vector<string> v_accumulator definiert, um temp Ergebnisse zu halten, da diese Funktion in der while-Schleife mehrmals aufgerufen werden kann und ich möchte mit einer Komma getrennten Wert-Liste enden.

Das Problem ist jedoch, dass mein Vektor v_accumulator bei jedem Funktionsaufruf immer leer ist? Wie macht das Sinn, da es eine Klassenvariable ist?

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; 
}; 

vielleicht gibt es einen einfacheren Weg, um die Werte von D, S im Wert Teil meines ursprünglichen Schlüssel/Wert-Paares verketten?

Antwort

4

Das Problem könnte sein, obwohl v_accumulator ein Klassenmember ist, kopiert boost::bind seine Argumente standardmäßig. Dies bedeutet, dass ConcatValues auf eine Kopie des helper mit seinem eigenen v_accumulator Vektor aufgerufen wird.

Wenn Sie einen Verweis möchten, müssen Sie boost::ref verwenden:

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

+1, Alternativ können Sie das erste Argument durch Zeiger im Fall der Bindung eines Mitglieds-Funktion übergeben. Die 'bind'-Vorlage wird sie korrekt verarbeiten: 'boost :: bind (& SerializerHelper :: ConcatValues, & helfer, _1, _2)'. –