web-dev-qa-db-ja.com

std :: result_ofとdecltypeの違い

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に渡される式で使用するファンクターのインスタンスがあります。
  • ファンクターの定義済みコンストラクターを知っている。

decltyperesult_ofの唯一の違いは、最初の式には式が必要であるのに対し、2番目の式には必要がないということです。

96
Luc Touraille

result_ofBoostで導入 、そして TR1に含まれる 、そして最後にC++ 0xでした。したがって、result_ofには、後方互換性のある利点があります(適切なライブラリと)。

decltypeはC++ 0xのまったく新しいものであり、関数の戻り値の型のみを制限するものではなく、言語機能です。


とにかく、gcc 4.5では、result_ofdecltypeに関して実装されます:

  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;
    };
84
kennytm