如何使用模板将QString转换为typename?

时间:2015-11-03 14:05:48

标签: c++ qt templates

我想编写一个计算某些东西的通用模板方法,最后返回typename T的值。该值来自QString,因此我需要将QString转换为指定的typename T。很遗憾,我只找到toDouble()toInt(),...方法。

我需要的是:

QString s = 3.1415;
double d = s.toType<double>();
float f = s.toType<float>();
int i = s.toType<int>();

我不想调用toDouble()toInt(),...因为我无法在编译时选择它们。

谢谢!

编辑:我可以编写自己的专用模板函数来完成此操作。所以

double myOwnConvertFunction<double>(const QString& s)

然后只需调用s.toDouble()

我认为Qt可能已经有了内置方式吗?

3 个答案:

答案 0 :(得分:7)

您可以将QString转换为QVariant anf,然后使用value()

QVariant(s).value<T>()

QVariant与QString共享数据,因此此处不会发生深层复制,结果也应该非常快。为了更加舒适,Qt已经

qvariant_cast<T>(s)

答案 1 :(得分:2)

您需要使用QTextStream。您可以使用QTextStream的{​​{3}}来完成此操作。您的代码可能如下所示:

template <typename T>
T toType(const QString& string) {
    T result;
    QTextStream stream(&string, QIODevice::ReadOnly);

    stream >> result;
    return result;
}

顺便提一下,根据您是否患有QString constructor,您也可以像这样完成QTextStream内联构建:

template <typename T>
T toType(const QString& string) {
    T result;

    QTextStream(&string, QIODevice::ReadOnly) >> result;
    return result;
}   

答案 2 :(得分:1)

你可以写一个非会员toType

template <typename T> struct type { };

template <typename T>
auto toType(QString const& q)
    -> decltype(toType(q, type<T>{}))
{
    return toType(q, type<T>{});
}

适当地使用一堆重载:

double toType(QString const& q, type<double> ) {
    return q.toDouble();
}

int toType(QString const& q, type<int> ) {
    return q.toInt();
}

float toType(QString const& q, type<float> ) {
    return q.toFloat();
}

...