std::result_of
C ++ 0xでの必要性を理解するのに問題があります。私が正しく理解した場合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に渡される式で使用するファンクタのインスタンスがあります。
- ファンクタの定義済みコンストラクタを知っています。
唯一の違いと考え中アムIの権利decltype
とは、result_of
第二にはないのに対し、最初の1が式を必要とするということですか?
decltype
は、醜いだけでなく、より強力です。result_of
呼び出し可能な型にのみ使用でき、引数として型が必要です。たとえば、result_of
ここでは使用できません:template <typename T, typename U> auto sum( T t, U u ) -> decltype( t + u );
引数が算術型である可能性がある場合(を表すF
ために定義できる関数はありません。ユーザー定義型では可能です。同じように(私は実際に遊んだことがありません)そのメンバー・メソッドへの呼び出しを行うのは難しいかもしれない結合剤またはラムダを使用せずF(T,U)
t+u
result_of