2016-06-28 3 views
1

Я хочу преобразовать QStrings в разные типы. Я хотел бы сделать это как можно проще и проще, без необходимости писать явный метод для каждого типа.Преобразование QStrings в другие типы

Я думал использовать шаблонную функцию, что-то вроде этого:

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

Очевидно, что это не работает, но что-то подобное, что я хотел бы иметь.

Есть ли простой способ сделать это?

+0

«Я хочу преобразовать QStrings в разные типы». В каком контексте? Может быть, вы захотите, может быть, вы этого не сделаете: расскажите, какая проблема, которую вы пытаетесь решить. Мотивируйте свой вопрос. –

+0

Все, что я действительно хочу сделать, это вопрос. Вот и все. У меня есть QStrings, я хочу преобразовать их в: int, int64_t, quint32, double, QStrings и т. Д. Действительно любой разумный тип. Я не хочу иметь отдельную функцию для каждого типа, но то, что я показал выше. Как: «Я получаю QStrings, которые читаются из файла, и я хочу их интерпретировать», добавьте больше значения в вопрос? – FreddyKay

+0

Мотивация ответит на очевидные проблемы типа «Итак, вы действительно хотите преобразовать' QString {"五"} 'в' double (5.0) '?" Вы не можете утверждать, что это не преобразование строки в «разумный тип» - это очевидно! Как вы знаете, какой тип * вы хотите преобразовать? И т. Д. Говоря «все, что есть», как вы утверждаете, не помогает. –

ответ

3

Вы можете использовать поток:

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

Это работает, но с учетом множества методов QString, которые делают преобразование и возвращают желаемый тип, это абсурдно дорого. Он решает мнимую проблему, которая уже решена в любом случае. –

3

QString имеет множество методов преобразовывают, и вы, вероятно, не нуждаются в вашей новой функции, например:

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 

Я не уверен, что это нормально, чтобы наследовать от QString или нет, но вы можете сделать ребенок от него и переопределить броски. Вы можете переопределить бросание класса, например:

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

int x = static_cast<int>(aCircle); 

Опять же, перекрывая static_cast для QString не выглядит логичным.

+0

В этом случае мне нужно пройти через каждую из функций преобразования. Я бы хотел этого избежать. Также могут быть случаи, когда на самом деле работают два метода преобразования QStrings («200» можно отличить до int и, например, удвоить). Также я хотел бы разрешить заливку в строку. Звучит глупо? Это. Его проектное решение, с которым я должен жить. Я просто пытаюсь сделать свою жизнь немного легче. – FreddyKay

+0

@FreddyKay: Тогда решение Jarod42 соответствует вашему требованию. – deepmax

+0

Правда. Я просто хотел указать, почему, хотя ваше решение будет работать над вышеуказанным вопросом, я лично не могу его использовать. – FreddyKay

1

Если подталкивания вариант можно было бы написать:

#include <boost/lexical_cast.hpp> 

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

Ссылки:

+0

Даже не подумал об этом, но, к сожалению, повышение невозможно. – FreddyKay

2

Кроме того, вы можете использовать Qt's meta-object system, который хорошо работает с пользовательскими типами.

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>(); 

Обратите внимание, что QVariant легко может быть преобразован в QString.


Более подробное описание: here.

+0

Я буду помнить это о будущем. Кажется, это слишком много для моей текущей проблемы, поскольку я работаю только с примитивными типами. Тем не менее, это приятное дополнение. – FreddyKay

+0

Спасибо, я вижу вашу точку зрения, но это пригодится, если вам нужно преобразование 'QVariant', чтобы оставаться на связи с некоторыми классами виджетов. Рад, что я могу показать вам кое-что. ;) – maxik

Смежные вопросы