2010-12-08 19 views
8

Ich habe eine Boost-Variante wie folgt aussehen: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;boost :: Variante <T> std :: string

ich eine Notwendigkeit für einen der Werte in dieser Variante zu einem std umwandeln zu können :: string , Ich fragte mich, ob es eine Template-Funktion gibt, die ich dafür verwenden könnte?

Oder was wäre der effektivste Weg?

Ich würde derzeit eine Reihe von überladenen Funktionen implementieren, die jeweils einen Typ und dann die Konvertierung mit std::stringstream oder für posix_time ich würde es verwenden, die Konvertierung Funktion. Vielleicht gibt es einen besseren Weg?

Antwort

9

Verwenden Sie boost::lexical_cast, die die ganze stringstream Sache hinter einem praktischen Wrapper verbirgt. Dies funktioniert auch mit boost :: posix_time, da es einen passenden operator<< hat.

1

Siehe generically convert from boost::variant<T> to type. Sie sollten diese Antwort an Ihre Situation anpassen können. Sie können boost::lexical_cast für alle Ihre Typen verwenden, mit Ausnahme der , wo Sie wahrscheinlich eine spezielle Lösung benötigen. All dies in der static_visitor mit Operator Überladung (Vorlage + eine für die ptime).

0

ein sauberer und elegant (aber nicht sehr effizient) Weg, um eine bestimmte Art in std::string zu konvertieren ist

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

von

#include <boost/lexical_cast.hpp>

Der Typ umgewandelt werden zu verwenden, muss den üblichen "< <" Operator für ostream bereitstellen.

Beispiel Nutzung: std::string s = boost::lexical_cast<std::string>(17); assert(s == "17");

+0

Eigentlich kann es auch effizienter sein (Boost eine Stapelanordnung für den Strompuffer verwendet werden soll, wenn die maximale Länge eines String-Darstellung des Typs zur Kompilierzeit bekannt). Aber die Frage lautete: boost :: variant. – UncleBens

3

Try this:

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

Sie können keine Vorlagenmethoden spezialisieren. Machen Sie es einfach zu einer normalen Methode ohne Vorlage. –

+0

Ok, geändert. Ich habe das nicht zusammengestellt. –

+0

Nice one! Leistungsstarke Nutzung von Überladung. –

Verwandte Themen