boost :: variantT zu std :: string

8

Ich habe eine Boost-Variante, die so aussieht: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

Ich muss in der Lage sein, einen der Werte in dieser Variante in eine std :: string umzuwandeln. Ich habe mich gefragt, ob es eine Template-Funktion gibt, die ich dafür verwenden könnte?

Oder was wäre der effektivste Weg?

Ich würde momentan eine Menge überladener Funktionen implementieren, die jeweils einen Typ annehmen und dann die Konvertierung mit std::stringstream durchführen oder für posix_time würde ich die Konvertierungsfunktion verwenden. Vielleicht gibt es einen besseren Weg?

    
Tony The Lion 08.12.2010, 15:30
quelle

4 Antworten

9

Benutze boost :: lexical_cast , was die ganze stringstream ding hinter einem praktischen Wrapper. Dies funktioniert auch mit boost :: posix_time, da es eine passende operator<< hat.

    
Marcelo Cantos 08.12.2010, 15:33
quelle
3

Versuchen Sie Folgendes:

%Vor%     
Pawel Zubrycki 08.12.2010 15:51
quelle
1

Siehe generisch von boost :: variant & lt; T & gt; tippen . Sie sollten diese Antwort an Ihre Situation anpassen können. Sie können boost::lexical_cast für alle Ihre Typen verwenden, mit Ausnahme von boost::posix_time::ptime , wo Sie wahrscheinlich eine spezielle Lösung benötigen. All dies in static_visitor mit Operatorüberladung (Vorlage + eine für ptime).

    
Daniel Lidström 08.12.2010 15:39
quelle
0
___ qstnhdr ___ boost :: variantT zu std :: string ___ answer4389417 ___

Versuchen Sie Folgendes:

%Vor%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ tag123variant ___ Ein Variant-Datentyp ist eine mit Tags versehene Union, die andere Datentypen enthält. Es wird normalerweise für Interop-Aufrufe zwischen Sprachen (C ++ und Visual Basic) in der klassischen Microsoft Windows COM-Programmierung verwendet. ___ answer4389284 ___

Siehe generisch von boost :: variant & lt; T & gt; tippen . Sie sollten diese Antwort an Ihre Situation anpassen können. Sie können std::string für alle Ihre Typen verwenden, mit Ausnahme von template<typename Target, typename Source> Target lexical_cast(const Source& arg); , wo Sie wahrscheinlich eine spezielle Lösung benötigen. All dies in #include <boost/lexical_cast.hpp> mit Operatorüberladung (Vorlage + eine für ptime).

    
___ qstntxt ___

Ich habe eine Boost-Variante, die so aussieht: std::string s = boost::lexical_cast<std::string>( 17 ); assert( s == "17" );

Ich muss in der Lage sein, einen der Werte in dieser Variante in eine std :: string umzuwandeln. Ich habe mich gefragt, ob es eine Template-Funktion gibt, die ich dafür verwenden könnte?

Oder was wäre der effektivste Weg?

Ich würde momentan eine Menge überladener Funktionen implementieren, die jeweils einen Typ annehmen und dann die Konvertierung mit %code% durchführen oder für %code% würde ich die Konvertierungsfunktion verwenden. Vielleicht gibt es einen besseren Weg?

    
___ antwort4389320 ___

Ein sauberer und eleganter (aber nicht effizienter) Weg, um einen bestimmten Typ in %code% umzuwandeln, ist

%code%

von

%code%

Der Typ, der konvertiert werden soll, muss das übliche "& lt; & lt;" Operator für Ostream.

Beispiel Verwendung: %code%

    
___ answer4389230 ___

Benutze boost :: lexical_cast , was die ganze %code% ding hinter einem praktischen Wrapper. Dies funktioniert auch mit boost :: posix_time, da es eine passende %code% hat.

    
___
eci 08.12.2010 15:42
quelle

Tags und Links