2017-07-06 33 views
0

是否可以将函数返回的变量或值作为模板参数传递。是否可以将变量/函数返回值作为模板参数

例子:

QVariantHash options; 
options.insert("fontStyle", fontStyleObject); // QFont fontStyleObject 
options.insert("fontColor", fontColorObject); // QColor fontColorObject 
Q_FOREACH(const QVariant &option, options){ 
    qDebug() << option.value<option.typeName()>(); 
} 

正如你所看到的,我已经通过了option.typeName()作为模板参数和方法返回的对象QString的类型。

我已经做到了,但有一个错误信息:error: C2974: 'QVariant::value': invalid template argument for 'T', type expected

是否有可能通过一个变量或函数作为模板参数返回的值?如果没有,那么做什么替代方法?

+0

所有模板魔术发生在编译时。在编译时,所有模板实例化的所有类型都必须已知。如果'option.typeName()'在编译时可能是已知的(例如,它是QVariantHash实例的某种依赖类型,我怀疑它),那么你可以。否则,你不能。 – iehrlich

+0

另外,不会'qDebug()<< option.toString()'在你的特定情况下工作吗?我的意思是,你试图序列化它,对吧? – iehrlich

+0

@iehrlich:别担心,这行'qDebug()<< option.value ();'只是一个例子。 –

回答

3

这是可能的,如果模板具有非类型模板参数和函数调用是一个常量表达式。例如

#include <type_traits> 

constexpr int foo() { 
    return 42; 
} 

template <int x> 
std::integral_constant<int, x> bar() { return {}; } 

int main() { 
    bar<foo()>(); 
} 
+0

我认为C++在这一点上不够灵活和糟糕。 –

0

我觉得你并不需要,在所有的,你可以只使用

牛逼的QVariant ::值()const的

你可以得到的牛逼喂qDebug()运营商< <。您可能需要定义如何打印T,看看:http://doc.qt.io/qt-4.8/qdebug.html#writing-custom-types-to-a-stream

for (auto const & option : options) 
    qDebug() << option.value(); //returns T automatically 
+0

问题不在'qDebug'中或打印出对象的值,这行'qDebug()<< option.value ();'只是一个例子,但真正的目标是检索每个对象都是它的原始类型。 –

+0

然后option.value()返回原始类型,即T – AKludges

+0

要使用此方法'T QVariant :: value()',您必须追加您希望作为模板参数的对象类型,如'value () ',否则会出现错误信息。 –

相关问题