2016-10-13 8 views
2

私は(明らかに)次の無効なコードの有効なC++ 11と同等やりたい:私は私のコンパイラから以下のエラーが出C++テンプレートメソッドの戻り型を他のクラスの静的メソッドの戻り型として宣言するにはどうすればよいですか?

class StaticMethodClass { 
public: 
    static int staticMethod(int a) {return 0;} 
}; 

#include <type_traits> 

template<class T> class ClassTemplate { 
public: 
    decltype(T::staticMethod(int)) methodTemplate(int a); 
}; 

template<class T> 
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) { 
    return T::staticMethod(a); 
} 

template class ClassTemplate<StaticMethodClass>; 

を:

/tmp$ g++ -std=c++11 -c a.cpp 
a.cpp:14:26: error: expected primary-expression before ‘int’ 
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) { 
         ^
a.cpp:14:32: error: prototype for ‘decltype (T:: staticMethod(<expression error>)) ClassTemplate<T>::methodTemplate(int)’ does not match any in class ‘ClassTemplate<T>’ 
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) { 
           ^
a.cpp:10:36: error: candidate is: int ClassTemplate<T>::methodTemplate(int) 
    decltype(T::staticMethod(int)) methodTemplate(int a); 
            ^
/tmp$ g++ -dumpversion 
4.8.3 

は、私が欲しいものです可能ですか?もしそうなら、どうですか?

答えて

2

私はstd::result_of作品をこのように考えていません。 result_of<F(ArgTypes...)>と定義されています(cppreference参照)。そのF引数はタイプである必要があります。 T::staticMethodと書くとresult_ofの機能で、のタイプはではありません。

Fは、呼び出し可能な型、関数への参照、または呼び出し可能な型への参照でなければなりません。 ArgTypesでFを呼び出すには、整形式でなければなりません。

あなたが望むのは、result_ofにその関数への参照の型を与えることです。その関数へのポインタは&T::staticMethodで与えられ、その型はdecltype(&T::staticMethod)で与えられます。このコードは機能します。 Chrisで指摘したように

typename std::result_of<decltype(&T::staticMethod)(int)>::type methodTemplate(int i) { 
    return T::staticMethod(i); 
} 

typenameに注意してください。

0

これは(http://ideone.com/6pczX3)の作品:

decltype(T::staticMethod(int)) methodTemplate(int i) { 
    return T::staticMethod(i); 
} 

が最初に私はあなたがおそらく適切typenameを追加する必要があると思ったが、それは動作しませんでした。あなたがdecltypeをスキップすることができ、C++ 14で

auto methodTemplate(int i) -> decltype(T::staticMethod(i)) { 
    return T::staticMethod(i); 
} 

+0

。しかし、実装をクラス外に移動すると、同じ問題が発生します。改訂されたコードを参照してください。 –

2

autoは、トリックを行う必要があります

auto methodTemplate(int i) { 
    return T::staticMethod(i); 
} 
+0

@SteveEmmerson 'decltype'を試してみてください。 – AlexD

0
decltype(T::staticMethod(int)) methodTemplate(int a); 

decltype(T::staticMethod(0)) methodTemplate(int a); 

または

decltype(T::staticMethod(std::declval<int>())) methodTemplate(int a); 

(および定義については同じ)でなければなりません。 `methodTemplateは()`クラス宣言で実施された最初のコード、のために働い

Demo

関連する問題