我想编写一个计算某些东西的通用模板方法,最后返回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可能已经有了内置方式吗?
答案 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();
}
...