オリジナルのstd::function<T1(T2)>
に対するT1 (*)(T2)
の利点は何ですか?
std::function
は、関数ポインタ以外、つまりfunctorsを保持できます。
#include <functional>
void foo(double){}
struct foo_functor{
void operator()(float) const{}
};
int main(){
std::function<void(int)> f1(foo), f2((foo_functor()));
f1(5);
f2(6);
}
例が示すように、compatibleである限り、まったく同じシグネチャは必要ありません(つまり、パラメータタイプstd::function
は、含まれている関数/ファンクタに渡すことができます)。
std::function
は、関数オブジェクト(ラムダを含む)だけでなく、正しいシグネチャを持つ関数ポインターを保持できます。したがって、より用途が広くなります。
よりすっきりとした外観とより記述的な構文を除いて、std::function
は任意のcallableオブジェクトを格納できます:
オブジェクトの保存、コピー、メンバー関数へのバインドは、はるかに簡単で直感的であることは言うまでもありません。