2011-12-29 11 views
4

を作る方法を、私たちは次のように使用std::functionを使用します。C++ 0xのではstd ::関数インスタンス

int normal_function() { 
    return 42; 
} 
std::function<int()> f = normal_function; 

だからstd::functionインスタンスを取得するために、我々は、まずその型を定義する必要があります。しかし、それは退屈で、時には難しい。

したがって、std::functionインスタンスをstd::tupleとちょうど同じにするにはmakeを使用できますか?

実際、私はグーグルで、C++ 0xはそのような機能を提供していません。

なぜC++ 0xはmake facilityを提供しませんか? これを実装できますか?

+0

私たちは 'auto'を持っていますか? – thiton

+0

@thiton:ここで自動支援はどうですか? –

+0

@BenjaminLindley:そうです、2番目の考えでは、 'auto f = normal_function;'という行は意味がありません。ごめんなさい。 – thiton

答えて

16

はい、私たちは、これはあなたがmake_functionに関数を渡す必要が

template<typename T> 
std::function<T> make_function(T *t) { 
    return { t }; 
} 

それを実装することができます。プレーンな機能以外の何かのためにこれを拾うために過負荷を防ぐために、あなたは

template<typename T> 
std::function< 
    typename std::enable_if<std::is_function<T>::value, T>::type 
> make_function(T *t) { 
    return { t }; 
} 

あなたはクラス型の関数オブジェクトはしかし、それを通過していないし、何のメンバーポインタができないことをSFINAEすることができます。任意の関数オブジェクトに対しては、コールシグネチャを取得する方法はありません(それぞれoperator()がテンプレートの場合はどうしますか?)。これはおそらく、C++ 11がそのような機能を提供しない理由です。

+0

バインド式や型情報がよく知られた標準構造に従うようなものに拡張することはおそらく可能でしょう。私は、 'weak_ptr'を' mem_fn'に渡し、 'weak_ptr'が死んでいた場合には、何もしないで呼び出しを行うだけのラッパーが欲しいと思っていました。 – Omnifarious

+0

'std :: mem_fn'を使ってメンバ関数ポインタを扱うことができます。 –

関連する問題