Plantilla de función C ++ y función de enlace

Una introducción a la función std ::

La plantilla de clase std :: function es un contenedor de función polimórfica general. Las instancias de std :: function pueden almacenar, copiar y llamar a cualquier objetivo invocable: incluidas funciones, expresiones lambda, expresiones vinculantes u otros objetos de función, así como punteros a funciones miembro y miembros de datos. Cuando el objeto std :: function no envuelve ningún elemento invocable real, llamar al objeto std :: function lanzará una excepción std :: bad_function_call.

Introducción a bind

Vinculación de función La función de vinculación se utiliza para vincular una determinada forma de lista de parámetros con una función conocida para formar una nueva función. Este método de cambiar el modo de llamada de función existente se denomina enlace de función. Necesito señalar: bind es un adaptador de función. El adaptador es un mecanismo para modificar y restringir cosas existentes para que pueda adaptarse a la nueva lógica.
Acepta un objeto invocable y genera un nuevo objeto invocable para adaptarse a la lista de parámetros del objeto original.
La forma general utilizada por bind:

auto newFun = bind(oldFun,arg_list);

Tres ejemplos

#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;
}

resultado
Inserte la descripción de la imagen aquí

Escenarios de uso de cuatro funciones

#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;
}

El código se toma de la función

Supongo que te gusta

Origin blog.csdn.net/GreedySnaker/article/details/114323759
Recomendado
Clasificación