2017-07-06 66 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 () ',否則會出現錯誤信息。 –

相關問題