Modèle de fonction C ++ et fonction de liaison

Une introduction à std :: function

Le modèle de classe std :: function est un wrapper de fonction polymorphe général. Les instances de std :: function peuvent stocker, copier et appeler n'importe quelle cible appelable: y compris des fonctions, des expressions lambda, des expressions de liaison ou d'autres objets de fonction, ainsi que des pointeurs vers des fonctions membres et des données membres. Lorsque l'objet std :: function n'enveloppe aucun élément appelable réel, l'appel de l'objet std :: function lèvera une exception std :: bad_function_call.

Introduction à la liaison

Liaison de fonction La fonction de liaison est utilisée pour lier une certaine forme de liste de paramètres avec une fonction connue pour former une nouvelle fonction. Cette méthode de modification du mode d'appel de fonction existant est appelée liaison de fonction. Attention: bind est un adaptateur de fonction. L'adaptateur est un mécanisme permettant de modifier et de restreindre les éléments existants afin qu'il puisse s'adapter à une nouvelle logique.
Il accepte un objet appelable et génère un nouvel objet appelable pour s'adapter à la liste de paramètres de l'objet d'origine.
La forme générale utilisée par bind:

auto newFun = bind(oldFun,arg_list);

Trois exemples

#include <functional>
#include <iostream>

int show(string name, int age)
{
    
    
	cout << "name:" << name << "\tage:"<<age << endl;

	return 0;
}

int main()
{
    
    
	// std::function
	using namespace std::placeholders;
	std::function<int(string, int)> func = show;
	func("张A", 100);

	//Lamda
	std::function<int(string, int)> funb = [](string name, int age)->int{
    
    
		cout << "name:" << name << "\tage:" << age << endl;
		return 0;
	};
	funb("张B", 95);

	//bind
	//在bind函数后有一个符号_1,这是一个占位符,代表绑定函数中的第一个参数,_2同理
	auto retfunc = bind(show, _2, _1);//相当于int show(int age, string name)
	retfunc(90,"张C");

	auto retfund = bind(show, _1, _2);//原函数
	retfund("张D", 85);

	auto retfune = bind(show, _1, 80);//相当于int show(int age)
	retfune("张E");

	auto retfunf = bind(show, "张F",75);//相当于int show()
	retfunf();

	system("pause");
	return 0;
}

résultat
Insérez la description de l'image ici

Quatre scénarios d'utilisation des fonctions

#include <iostream>
#include <functional>

using namespace std;

std::function<bool(int, int)> fun;
//普通函数
bool compare_com(int a, int b)
{
    
    
	return a > b;
}
//lambda表达式
auto compare_lambda = [](int a, int b) {
    
     return a > b; };
//仿函数
class compare_class
{
    
    
public:
	bool operator()(int a, int b)
	{
    
    
		return a > b;
	}
};
//类成员函数
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;
	}
};
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;

	return 0;
}

Le code est tiré de la fonction

Je suppose que tu aimes

Origine blog.csdn.net/GreedySnaker/article/details/114323759
conseillé
Classement