2010-12-08 5 views
8

J'ai une variante de poussée de ressembler à ceci: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;boost :: variante <T> à std :: string

J'ai besoin d'être en mesure de convertir l'une des valeurs dans cette variante à un std :: string , Je me demandais s'il y a une fonction de type de modèle que je pourrais utiliser pour faire cela?

Ou quel serait le moyen le plus efficace?

Je voudrais actuellement mettre en œuvre un tas de fonctions surchargées, chacun en prenant un type et ensuite faire la conversion en utilisant std::stringstream ou pour posix_time je voudrais utiliser sa fonction de conversion. Peut-être qu'il y a un meilleur moyen?

Répondre

9

Utilisez boost::lexical_cast, qui cache toute la chose stringstream derrière un emballage pratique. Cela fonctionne également avec boost :: posix_time, car il a un operator<< approprié.

1

Voir generically convert from boost::variant<T> to type. Vous devriez être capable d'adapter cette réponse à votre situation. Vous pouvez utiliser boost::lexical_cast pour tous vos types sauf le boost::posix_time::ptime où vous avez probablement besoin de faire une solution spéciale. Tout cela dans le static_visitor en utilisant la surcharge de l'opérateur (modèle + un pour le ptime).

0

un plus propre et plus élégant (mais pas plus efficace) façon de convertir un certain type en std::string est d'utiliser

template<typename Target, typename Source> Target lexical_cast(const Source& arg);

de

#include <boost/lexical_cast.hpp>

Le type à convertir doit fournir l'opérateur habituel "< <" pour ostream.

Exemple d'utilisation: std::string s = boost::lexical_cast<std::string>(17); assert(s == "17");

+0

En fait, il peut aussi être plus efficace (coup de pouce devrait utiliser un tableau de pile pour le tampon de flux si la longueur maximale de la représentation de chaîne d'un type est connu au moment de la compilation). Mais la question portait sur 'boost :: variant'. – UncleBens

3

Essayez ceci:

struct to_string_visitor : boost::static_visitor<> 
{ 
    std::string str; 

    template <typename T> 
    void operator()(T const& item) 
    { 
    str = boost::lexical_cast<std::string>(item); 
    } 
    void operator()(boost::posix_time::ptime const & item) 
    { 
    //special handling just for ptime 
    } 
}; 

int main(){ 
    variant v = 34; 
    to_string_visitor vis; 
    boost::apply_visitor(vis, v); 
    cout << vis.str << endl; 
} 
+0

Vous ne pouvez pas spécialiser les méthodes de modèle. Juste en faire une méthode régulière, sans modèle. –

+0

Ok, changé. Je n'ai pas compilé cela. –

+0

Nice one! Utilisation puissante de la surcharge. –

Questions connexes