C++ 0xでstd::result_of
の必要性を理解するのに苦労しています。正しく理解できれば、result_of
を使用して、特定のタイプのパラメーターで関数オブジェクトを呼び出す結果のタイプを取得します。例えば:
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
次のコードとの違いは実際には見当たりません。
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
または
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
これら2つのソリューションで見られる唯一の問題は、次のいずれかが必要なことです。
decltype
とresult_of
の唯一の違いは、最初の式には式が必要であるのに対し、2番目の式には必要がないということです。
result_of
は Boostで導入 、そして TR1に含まれる 、そして最後にC++ 0xでした。したがって、result_of
には、後方互換性のある利点があります(適切なライブラリと)。
decltype
はC++ 0xのまったく新しいものであり、関数の戻り値の型のみを制限するものではなく、言語機能です。
とにかく、gcc 4.5では、result_of
はdecltype
に関して実装されます:
template<typename _Signature>
class result_of;
template<typename _Functor, typename... _ArgTypes>
struct result_of<_Functor(_ArgTypes...)>
{
typedef
decltype( std::declval<_Functor>()(std::declval<_ArgTypes>()...) )
type;
};