std::functionとstd::bind詳細
3149 ワード
std::function
std::functionはヘッダファイルincludeに含まれ、各種呼び出し可能なエンティティをカプセル化して統一することができる.一般関数 lambda式 関数ポインタ シミュレーション関数(functorリロードカッコ演算子実装) クラスメンバー関数 静的メンバー関数 次の例では、上記のいくつかの方法で、2つの数のサイズを簡単に比較する機能を実現します.
1.一般関数
2.lambda式
3.擬似関数
4.クラスメンバー関数(動的、静的)
対応するmain関数は次のとおりです.
次にstd::bind関数について説明します.
std::bind関数は呼び出し可能オブジェクト(前述の6種類)と呼び出し可能オブジェクトのパラメータをバインドし、新しい呼び出し可能オブジェクト(std::functionタイプ、パラメータリストが変更可能)を返し、返される新しいstd::function呼び出し可能オブジェクトのパラメータリストはbind関数実パラメータのstd::placeholders:::x小さいから大きいまで対応するパラメータを決定する.次に、シミュレーション関数バインドを例に、入力数が3未満かどうかを比較します.
ここで、返される新しいstd::function呼び出し可能なオブジェクトのパラメータリストがどのように決定されるかを詳細に説明します.
std::functionはヘッダファイルincludeに含まれ、各種呼び出し可能なエンティティをカプセル化して統一することができる.
#include
#include
using namespace std;
std::function fun;
1.一般関数
//
bool compare_com(int a, int b)
{
return a > b;
}
2.lambda式
//lambda
auto compare_lambda = [](int a, int b){ return a > b;};
3.擬似関数
//
class compare_class
{
public:
bool operator()(int a, int b)
{
return a > b;
}
};
4.クラスメンバー関数(動的、静的)
//
class compare
{
public:
bool compare_member(int a, int b)
{
return a > b;
}
static bool compare_static_member(int a, int b)
{
return a > b;
}
};
対応するmain関数は次のとおりです.
int main()
{
bool result;
fun = compare_com;
result = fun(10, 1);
cout << " , result is " << result << endl;
fun = compare_lambda;
result = fun(10, 1);
cout << "lambda , result is " << result << endl;
fun = compare_class();
result = fun(10, 1);
cout << " , result is " << result << endl;
fun = compare::compare_static_member;
result = fun(10, 1);
cout << " , result is " << result << endl;
, bind , ,
compare temp;
fun = std::bind(&compare::compare_member, temp, std::placeholders::_1, std::placeholders::_2);
result = fun(10, 1);
cout << " , result is " << result << endl;
次にstd::bind関数について説明します.
std::bind関数は呼び出し可能オブジェクト(前述の6種類)と呼び出し可能オブジェクトのパラメータをバインドし、新しい呼び出し可能オブジェクト(std::functionタイプ、パラメータリストが変更可能)を返し、返される新しいstd::function呼び出し可能オブジェクトのパラメータリストはbind関数実パラメータのstd::placeholders:::x小さいから大きいまで対応するパラメータを決定する.次に、シミュレーション関数バインドを例に、入力数が3未満かどうかを比較します.
//bind
std::function fun2;
// int,std::placeholders::_1 compare_class()
fun2 = std::bind(compare_class(), 3, std::placeholders::_1);
result = fun2(3);
cout << "bind , result is " << result << endl;
return 0;
}
ここで、返される新しいstd::function呼び出し可能なオブジェクトのパラメータリストがどのように決定されるかを詳細に説明します.
#include
#include
using namespace std;
struct Int
{
int a;
};
bool compare_com(struct Int a, float b)
{
return a.a > b;
}
int main()
{
Int a = {1};
//placeholders::_1 float, placeholders::_2 struct Int fun function
std::function fun = bind(compare_com, placeholders::_2, placeholders::_1);
bool result = fun(2.0, a);
cout << "result is " << result << endl;
return 0;
}