0

我正在學習如何獲得type重載函數test()test(double)的返回值。「std :: result_of」中沒有類型命名爲「type」;從超載函數獲得返回類型

我修改了代碼a SO answer (by chris)

#include <type_traits> 
#include <utility> 

int test(); 
double test(double x); 

template<typename... Ts> 
using TestType = decltype(test(std::declval<Ts>()...))(Ts...); 

int main() { 
    std::result_of< TestType<double> >::type n = 0; 
    //^ ### compile error ### 
    using doubleDat = std::result_of< TestType<double> >::type ; 
    doubleDat n=0; 
} 

我有一個編譯錯誤。

error: no type named 'type' in 'std::result_of'

據我瞭解: -

  • TestType<...>是 「可變參數模板」。
    用我自己的話說,它的行爲如同一個包裝的縮寫,它有任何數量的參數。

  • TestType<double>idtest(double)函數。

  • std::result_of<TestType<double>>::typetest(double)的返回類型。
    doubleDat應該是double

問題:爲什麼不編譯?如何解決它?

我已閱讀這些: -

線索相關的問題:一個漫長的探索後,我得到我的代碼遭受的微弱氣味「最令人頭疼的解析」。

回答

4

看看你的TestType<double>擴展爲:

test(std::declval<double>())(double) 

test(std::decvlal<double>)double等你拿double(double)

result_of<double(double)>::type詢問是否可以用double類型的參數調用double

答案是否定的,因爲double不可調用,所以沒有嵌套類型。

您需要閱讀result_of的文檔以瞭解如何使用它。 result_of<F(Arg)>::type類型是調用F並帶有參數Arg的結果。如果F可用參數Arg進行調用,則返回類型爲Arg,如果該參數不可調用,則嵌套的type不存在。

所以這會工作:

using func_type = TestType<double>; 
using doubleDat = std::result_of<func_type*(double)>::type; 

這對於TestType<double>類型(即double(double))的函數創建一個別名,然後詢問是否可以用的參數調用一個指針類型(即double(*)(double))鍵入double。你可以,所以你的type是有效的。

+0

剛剛在試驗後寫我自己的答案。你擊敗了我。 –

+0

我想要善於處理這些事情。 (我正在慢慢地從試驗和錯誤中學習)。如何在一個大塊中獲得關於這個領域的豐富知識?有沒有書,例如哪一個在[一本C++書籍SO鏈接](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)中,深入討論了這些主題?教程視頻?你寫一些C++書籍嗎? – javaLover

+3

[在21天內自學C++](http://abstrusegoose.com/249) –