2010-12-15 23 views
1

J'ai un boost::variant, qui contient différents types et j'ai une chaîne qui doit ressembler à ceci: type = D, S. Les valeurs de la variante sont respectivement D et S, la clé est 'type'. Maintenant, j'applique un static_visitor à ma variante pour faire la conversion appropriée, qui dans ce cas pourrait ne pas être nécessaire mais pour un autre type, il faudrait convertir en un chaîne.concaténer des valeurs dans une boucle while mal tourné

J'appelle cette fonction appelée ConcatValues, une partie d'une classe d'aide. Cette classe a un vector<string> v_accumulator défini, pour contenir les résultats temporaires, car cette fonction peut être appelée plusieurs fois dans la boucle while et je veux finir avec une liste de valeurs séparées par des virgules.

Le problème est cependant que mon vecteur v_accumulator est toujours vide sur chaque appel de fonction? Comment cela a-t-il un sens, vu qu'il s'agit d'une variable de classe?

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

peut-être il y a un moyen plus facile de concaténer les valeurs de D, S dans la partie de la valeur de ma paire de clés d'origine/valeur?

Répondre

4

Le problème peut être que, bien que v_accumulator soit un membre de classe, boost::bind copie ses arguments par défaut. Cela signifie que ConcatValues est appelée sur une copie du helper, avec son propre vecteur v_accumulator.

Si vous voulez une référence, vous devez utiliser boost::ref:

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

+1, Sinon, vous pouvez passer le premier argument pointeur dans le cas de la liaison d'une fonction membre. Le modèle 'bind' le traitera correctement:' boost :: bind (& SerializerHelper :: ConcatValues, & helper, _1, _2) '. –