(C++11 のプロの場合は、太字の段落までスキップしてください。)
型がテンプレート パラメータである渡されたオブジェクトの結果を呼び出して返すテンプレート メソッドを書きたいとしましょう。
template<ReturnType, T>
ReturnType doSomething(const T & foo) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}
したがって、次のような呼び出しで使用するにT
は、メソッドが必要です。ReturnType T::bar() const
struct MyClass {
...
int bar() const;
...
};
...
MyClass object;
int x = doSomething<int, MyClass>(object);
MyClass
型推論のおかげで書く必要はなく、呼び出しは次のようになります。
int x = doSomething<int>(object);
ただし、省略しすぎると、後で<int>
代入するためにメソッドが int を返す必要がないため、コンパイル エラーが発生します(たとえば、返される可能性があります)。x
char
C++0x/11 では、テンプレート メソッドの戻り値の型を推測するために使用できるauto
andがあります。decltype
template<T>
auto doSomething(const T & foo) -> decltype(foo.bar()) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}
コンパイラは、 の型が何であるかを調べ、foo.bar()
これを戻り値の型として使用します。具象クラスMyClass
では、これは にint
なり、以下で十分です。
int x = doSomething(object);
今私の質問に:
MyClassbar()
が を返すように定義されている場合int&
、 の戻り値の型doSomething(object)
もint&
=になりdecltype(foo.bar())
ます。これは問題です。G++ が準拠するようになったため、一時的な参照を返しているからです。
どうすればこれを修正できますか? remove_reference
のように使えるものはありremove_reference(decltype(foo.bar()))
ますか?
T&
a を受け取って aを返すヘルパー メソッドを宣言し、T
の戻り値の型doSomething
を be に定義することだけを考えましdecltype(helper(foo.bar()))
た。しかし、もっと良い方法があるはずです、私はそれを感じています。