1. ホーム
  2. c++

[解決済み] std::result_ofとdecltypeの違いについて

2022-11-14 14:39:31

疑問点

の必要性を理解するのに苦労しています。 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番目は必要ないということでしょうか?

どのように解決するのですか?

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