C++におけるbind関数の使い方

1665 ワード

bindは、指定した呼び出し可能なエンティティのいくつかのパラメータを既存の変数にバインドして、コールバック関数の使用中にも役立つ新しい呼び出し可能なエンティティを生成するメカニズムです.C++98には、functorの最初のパラメータと2番目のパラメータをバインドするために使用できる2つの関数bind 1 stとbind 2 ndがあり、いずれも1つのパラメータしかバインドできません.様々な制限により、bind 1 stおよびbind 2 ndの可用性が大幅に低下する.C++0 xではstd::bindが提供され、バインドされたパラメータの個数は制限されず、バインドされた具体的なパラメータも制限されず、ユーザーが指定し、このbindこそ本当の意味でのバインドであり、それがあればbind 1 stとbind 2 ndは何の役にも立たないので、C++0 xではbind 1 stとbind 2 ndの使用は推奨されず、deprecatedである.次にbindの使い方を例に挙げてみましょう.
#include < functional>
 
int Func(int x, int y);
auto bf1 = std::bind(Func, 10, std::placeholders::_1);
bf1(20); ///< same as Func(10, 20)
 
class A
{
public:
    int Func(int x, int y);
};
 
A a;
auto bf2 = std::bind(&A::Func, a, std::placeholders::_1, std::placeholders::_2);
bf2(10, 20); ///< same as a.Func(10, 20)
 
std::function< int(int)> bf3 = std::bind(&A::Func, a, std::placeholders::_1, 100);
bf3(10); ///< same as a.Func(10, 100)

上記の例では、bf 1は、2つのパラメータの一般関数の最初のパラメータを10にバインドし、新しいパラメータを生成する呼び出し可能なエンティティである.bf 2は、クラスメンバー関数をクラスオブジェクトにバインドし、通常の関数のような新しい呼び出し可能なエンティティを生成する.bf 3はクラスメンバー関数をクラスオブジェクトと2番目のパラメータにバインドし,新しいstd::functionオブジェクトを生成する.上の例を見て、bindを使用する上で注意しなければならないことを説明します.
  • (1)bind予めバインドされたパラメータは、特定の変数または値を伝達する必要があり、予めバインドされたパラメータはpass-by-valueの
  • である.
  • (2)事前にバインドされていないパラメータについてはstd::placeholdersを転送し、1から順に増加します.placeholderはpass-by-referenceの
  • です
  • (3)bindの戻り値は呼び出し可能なエンティティであり、std::functionオブジェクト
  • に直接割り当てることができる.
  • (4)バインディングポインタ、参照タイプのパラメータについて、ユーザは、呼び出し可能なエンティティ呼び出しの前に、これらのパラメータが利用可能な
  • であることを保証する必要がある.
  • (5)クラスのthisは、
  • をオブジェクトまたはポインタでバインドすることができる.
    参照先:https://blog.csdn.net/crayondeng/article/details/9996625