2015-11-08 12 views
7

私は、構造体のどこかにあります:C++でオーバーロードされたメソッドの戻り値の型を取得する方法は?

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

私はコンパイル時にヘルパーを使用してf()の戻り値型を取得したいです。

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

をしかし、コンパイラは私に合理的なエラーを与える:私はstd::result_of<>をしようとしている「オーバーロードされた関数への参照を解決できませんでした」。

だから、thisが受け入れられ、upvoted回答を参照してください、これはstatic_cast<ComplicatedType1 (A::*)()>(&A::f)を作ることを提案しますが、私はComplicatedType1を持っていません。私は再帰で立ち往生している。


どのようにコードの最小と私のusing式の中ComplicatedType1を取得しますか?

+3

これはdecltypeの仕事ですか? –

+1

'auto'キーワードでタイプ控除を使用できませんか? –

+0

'std :: result_of'はテンプレート引数としてa * 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

EDITのための仕事のthatsです:(代わりにFの(int型))は、fの戻り値の型を()を取得するように変更し、C++ 11の(cの代わりには、 ++ 14)on Coliru

関連する問題