2017-04-13 16 views
0

私は、Aというメソッドのクラスのようなものをいくつか持っています。たとえば、get_value()は、さまざまな型の値を返します。そして1つのクラスBは、メソッドvalue()で値を返します。例:クラスメンバ関数の戻り値の型

ここで、これらのクラスの値を取得する関数が必要です。それは私に始まるVS2010でコンパイルエラーの数与え

template<typename T> 
auto get_value(const T & t) -> result_of<decltype(&T::get_value)(T)>::type 
{ 
    return t.get_value(); 
} 

Bについて

Error 1 error C2061: syntax error : identifier 'type' c:\_data\work\vmxi\c++\vox\vox\template_specialization.h 51 

を、私は正常に動作し、過負荷を、持っている私は、機能を持っています。質問は、どのようにresult_of<>()で動作するようにget_value()ですか?

P.S.うーん、私はちょうど-> decltype(T().get_value())を使っていたかもしれないことに気づきました。うまくいきます。しかし、なぜresult_of<>()は機能しませんか?

result_of<decltype(&A_like1::get_value)(A_like1)>::type i=0; 
+1

あなたがC++のどのバージョンを使用していますか? C++ 14を使用している場合、後続の戻り値の型はまったく必要なく、単に 'auto'を使用します。 – NathanOliver

+0

@ NathanOliver私は彼が 'A'のようなクラスで動作するようにここに提示され、' B'のようなクラスで動作するように、同じ名前の2つのテンプレート関数を使用すると仮定します。そして、SFINAEをトリガするために後続の戻り値の型が必要です。 – Corristo

+0

@Corristoはいはい。私は逃しました。ありがとう。 – NathanOliver

答えて

1

typenameは依存名は、std::result_of<T>::typeように、タイプであることを宣言するために使用することができますキーワード:加えて、私は.cppファイル内の変数を宣言することができました。それ以外の場合は、std::result_of<T>::typeがデータメンバーであると考えられます。 C++ 14では、いくつかのタイプ特性がtypenameキーワードを含むusingエイリアスを取得しました。これらのエイリアスは常に特性と同じ名前で、接尾辞は_tです。

試してみてください。C++ 14と

typename result_of<decltype(&T::get_value)(T)>::type 

または、:

result_of_t<decltype(&T::get_value)(T)> 
+0

どれくらい簡単です!本当にありがとう ) – Qwertypal