2016-06-28 20 views
1

Ich möchte QStrings in verschiedene Typen konvertieren. Ich möchte das so generisch und einfach wie möglich machen, ohne für jeden Typ eine explizite Methode schreiben zu müssen.Konvertiere QStrings in andere Typen

Ich dachte an einer Template-Funktion, so etwas wie dies mit:

template<typename T> 
void getValueFromString(QString str, T& returnVal) 
{ 
    returnVal = static_cast<T>(str); 
} 

Offensichtlich ist dies nicht funktioniert, aber so etwas wie die Ich mag haben würde.

Gibt es eine einfache Möglichkeit, das zu tun?

+0

"Ich möchte QStrings in verschiedene Typen konvertieren." In welchem ​​Kontext? Vielleicht willst du das, vielleicht auch nicht: erzähle uns, was das größere Problem ist, das du lösen willst. Motiviere deine Frage. –

+0

Alles, was ich wirklich tun möchte, ist in der Frage. Das ist alles was es gibt. Ich habe QStrings, ich möchte sie zu konvertieren: int, int64_t, quint32, doppelt, QStrings, etc. wirklich jeden vernünftigen Typ. Ich möchte keine separate Funktion für jeden Typ haben, sondern etwas, das ich oben gezeigt habe. Wie funktioniert das: "Ich bekomme QStrings, die aus einer Datei gelesen werden und ich möchte sie interpretieren", fügen Sie der Frage mehr Wert hinzu? – FreddyKay

+0

Motivation würde offensichtliche Probleme wie "Also, Sie wollen wirklich konvertieren die' QString {"五"} 'zu' double (5.0) '?" Sie können nicht behaupten, dass dies nicht eine Zeichenfolge in einen "vernünftigen Typ" konvertiert - es ist offensichtlich! Woher weißt du * was * Typ du konvertieren willst? Etc. Das Sagen "das ist alles da ist", wie Sie behaupten, ist nicht hilfreich. –

Antwort

3

Sie Strom verwenden:

template<typename T> 
void getValueFromString(QString str, T& returnVal) 
{ 
    QTextStream stream(str); 
    stream >> returnVal; 
} 
+0

Dies funktioniert, aber angesichts der Fülle von 'QString'-Methoden, die die Konvertierung durchführen und den gewünschten Typ zurückgeben, ist es absurd teuer. Es löst ein imaginäres Problem, das ohnehin schon gelöst ist. –

3

QString hat viele Konvertiten Methoden und Sie wahrscheinlich Ihre neue Funktion nicht benötigen, zum Beispiel:

QString str = "FF"; 
bool ok; 
int hex = str.toInt(&ok, 16);  // hex == 255, ok == true 
int dec = str.toInt(&ok, 10);  // dec == 0, ok == false 

Ich bin nicht sicher, ob es in Ordnung ist von QString oder nicht erben, aber Sie können eine machen Kind von ihm und überstechen. Sie können Abguss einer Klasse, zum Beispiel außer Kraft setzen:

class Circle 
{ 
public: 
    Circle(int radius) : radius(radius) {} 
    operator int() const { return radius; } 
private: 
    int radius; 
}; 

int x = static_cast<int>(aCircle); 

Wieder zwingende static_cast für QString nicht logisch aussieht.

+0

In diesem Fall muss ich jede der Konvertierungsfunktionen durchlaufen. Ich möchte das vermeiden. Es kann auch Fälle geben, in denen zwei Konvertierungsmethoden von QStrings tatsächlich funktionieren ("200" kann zum Beispiel in int und doppelt umgewandelt werden). Auch ich möchte Cast auf String erlauben. Klingt albern? Es ist. Es ist eine Designentscheidung, mit der ich leben muss. Ich versuche nur, mein Leben ein bisschen leichter zu machen. – FreddyKay

+0

@FreddyKay: Dann passt Jarod42's Lösung zu Ihrer Anforderung. – deepmax

+0

Wahr. Ich wollte nur darauf hinweisen, warum, obwohl Ihre Entscheidung für obige Frage funktionieren würde, kann ich sie persönlich nicht verwenden. – FreddyKay

1

Wenn Boost-Option ist, könnte man schreiben:

#include <boost/lexical_cast.hpp> 

template<typename T> 
void getValueFromString(QString str, T& returnVal) 
{ 
    returnVal = boost::lexical_cast<T>(str.toStdString()); 
} 

Referenzen:

+0

Dachte nicht mal dran, aber leider ist Boost nicht möglich. – FreddyKay

2

Zusätzlich können Sie Qt's meta-object system verwenden, was gut mit benutzerdefinierten Typen funktioniert.

struct MyStruct 
{ 
    int i; 
    ... 
}; 
Q_DECLARE_METATYPE(MyStruct) 

... 

MyStruct s; 
QVariant var; 
var.setValue(s); // copy s into the variant 

... 

// retrieve the value 
MyStruct s2 = var.value<MyStruct>(); 

Beachten Sie, dass ein QVariant leicht in eine QString umgewandelt werden kann.


Einige ausführlichere Lesung ist here.

+0

Ich werde es für die Zukunft behalten. Scheint ein wenig Overkill für mein aktuelles Problem, da ich nur mit primitiven Typen arbeite. Trotzdem ist das eine nette Ergänzung. – FreddyKay

+0

Danke, ich sehe Ihren Punkt, aber es ist praktisch, wenn Sie die 'QVariant'-Konvertierung benötigen, um mit einigen Widget-Klassen in Kontakt zu bleiben. Ich bin froh, dir etwas zeigen zu können. ;) – maxik