web-dev-qa-db-ja.com

なぜ元のC関数ポインターではなく、C ++でstd :: functionを使用するのですか?

オリジナルのstd::function<T1(T2)>に対するT1 (*)(T2)の利点は何ですか?

44
Michael Dorst

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は、含まれている関数/ファンクタに渡すことができます)。

35
Xeo

std::functionは、関数オブジェクト(ラムダを含む)だけでなく、正しいシグネチャを持つ関数ポインターを保持できます。したがって、より用途が広くなります。

16

よりすっきりとした外観とより記述的な構文を除いて、std::functionは任意のcallableオブジェクトを格納できます:

  • 機能
  • ラムダ式
  • バインド式
  • 関手

オブジェクトの保存、コピー、メンバー関数へのバインドは、はるかに簡単で直感的であることは言うまでもありません。

7
Shoe