2015-11-08 85 views
7

我有一個結構的地方:如何在C++中獲取返回類型的重載方法?

struct A { 
    ComplicatedType1 f(); 
    ComplicatedType2 f(int); 
}; 

我想用編譯時的助手獲得回報型f()。我想std::result_of<>

using Type = std::result_of<decltype(&A::f)()>::type; 

但是,編譯器給我一個合理的錯誤:「引用重載函數無法解析」。

所以我去SO看到this接受和upvoted的答案,這表明建立一個static_cast<ComplicatedType1 (A::*)()>(&A::f) - 但我沒有ComplicatedType1在這一點上。我被困在遞歸中。


如何獲得ComplicatedType1using表達式內用最少的代碼?

+3

這可能是decltype的工作嗎? –

+1

你不能用'auto'關鍵字使用類型扣除嗎? –

+0

'std :: result_of'需要一個* type *作爲它的模板參數,但'&A :: f'不是一個類型; '(&A :: f)()'也不是。此外,'result_of'是一個特殊的pre-C++ 11工具,對於大多數應用程序來說,它被'decltype'所取代:'decltype(f())' – dyp

回答

12

那是爲decltype + declval

#include <iostream> 
#include <type_traits> 
#include <utility> 

struct ComplicatedType1 {}; 
struct ComplicatedType2 {}; 

struct A { 
    ComplicatedType1 f(); 
    ComplicatedType2 f(int); 
}; 

int main() 
{ 
    using Type = decltype(std::declval<A>().f()); 
    static_assert(std::is_same<Type,ComplicatedType1>::value,"Oops"); 
} 

live at Coliru

編輯作業:改變以獲得F(的返回類型)(而不是F(INT))和以C++ 11(而不是C++ 14)上Coliru