117-C++11中引入的bind绑定器和function函数对象

C++11绑定器bind及function机制 之前在学muduo网络库时,看到陈硕以基于对象编程的方式,大量使用boost库中的bind和function机制,如今,这些概念都已引入至C++11,包含在头文件中。本篇文章主要梳理C++绑定器相关的内容以及C++11中引入的functionbind1st、bind2nd、bind(C++11)。学完本篇内容,将对C++绑定器及function机制等的底层实现有深刻理解,那么我们开始说吧。本文通过C++11之前的bind1st和bind2nd。 阅读详情

1、C++11中引入的bind绑定器和function函数对象

1.1、bind1st和bind2d使用

  • bind1st和bind2d是STL中的;

  • bind1st和bind2d作用: 将二元函数对象的一个参数绑定,使其变为一元函数对象;

  • 缺点: 只能用于二元函数对象。

  • 函数对象: 对象拥有小括号重载函数的对象。

#include <functional>		--包含c++库中的所有的函数对象
#include <algorithm>		--包含了c++库中的所有的泛型算法

在这里插入图片描述

例1—改变排序顺序

在这里插入图片描述
在这里插入图片描述
greater是一个二元函数对象:(因为一次需要从容器中拿2个函数对象出来)
在这里插入图片描述
在这里插入图片描述
传入greater函数对象后,就是从大到小进行排序了。
在这里插入图片描述

#include <iostream>
#include <vector> 
#include <functional>
#include <algorithm>
#include <ctime>
using namespace std;

template<typename Container>
void showContainer(Container& con)
{
	typename Container::iterator it = con.begin();
	//编译器是从上到下编译的,这个还没有实例化,它不知道这个名字作用域后面的iterator是类型还是变量
	//typename告知编译器后面类型的作用域后面是类型
	for (; it != con.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main()
{
	vector<int> vec;
	srand(time(nullptr));
	for (int i = 0; i < 20; ++i)
	{
		vec.push_back(rand() % 100 + 1);//随机出来的数字,并不是有序的 
	}

	showContainer(vec);
	sort(vec.begin(), vec.end());//默认小到大排序,传入的是起始和末尾的后继的迭代器
	showContainer(vec);
	//greater 二元函数对象
	sort(vec.begin(), vec.end(), greater<int>());//大到小排序
	showContainer(vec);
	return 0;
}

例2—将70按顺序插入到vec容器中

问题:将70按顺序插入到vec容器中

使用find_if函数需要传入一个一元函数对象(一次从容器中拿出一个元素和70进行比较 )

注意:库里面提供的函数对象都是二元的,没有办法直接使用;怎么办?

使用绑定器; 将二元函数对象转换为一元函数对象;
在这里插入图片描述
在这里插入图片描述

使用greater函数对象,用绑定器将其绑定为一元函数对象:

bind1st:绑定第1个参数,也就是70 > b,b就是容器中的每个元素,找到第一个小于70的位置。
在这里插入图片描述
使用less函数对象,用绑定器将其绑定为一元函数对象:

bind2d:绑定第2个参数,a < 70,找到第一个小于70的位置。

注意,这是生成的随机数
在这里插入图片描述

1.2、bind1st和bind2d底层原理

实现自己的find_if—my_find_if
在这里插入图片描述
函数模板,接收用户传入的二元函数对象和所要绑定的值;

为什么用函数模板去封装?

不用自己去写模板参数,可以自己推导。

mybind1st就是将函数对象封装了一下。
在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述
直接使用自己的即可。

bind2d就是在类中重载时,将绑定的位置交换即可。

#include <iostream>
#include <vector> 
#include <functional>
#include <algorithm>
#include <ctime>
using namespace std;

template<typename Container>
void showContainer(Container& con)
{
	typename Container::iterator it = con.begin();
	for (; it != con.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

template<typename Iterator, typename Compare>
Iterator my_find_if(Iterator first, Iterator last, Compare comp)
//遍历这2个迭代器之间的元素,如果满足函数对象的运算,就返回当前迭代器,如果都不满足,返回end()
{
	for (; first != last; ++first)
	{
		if (comp(*first))//comp.operator()(*first)一元函数对象,因为要从容器拿1个元素和它指定的元素比较
		//my_find_if需要1元函数对象,而在库里面都是二元的
		{
			return first;
		}
	}
	return last;
}

template<typename Compare, typename T>
class _mybind1st//绑定器是函数对象的一个应用
{
public:
	_mybind1st(Compare comp, T val)
		:_comp(comp), _val(val)
	{}
	bool operator()(const T& second)
	{
		return _comp(_val, second);//greater
	}
private:
	Compare _comp;
	T _val;
};

//mybind1st(greater<int>(), 70)
template<typename Compare, typename T>
_mybind1st<Compare, T> mybind1st(Compare comp, const T& val)
{
	//直接使用函数模板,好处是,可以进行类型的推演
	return _mybind1st<Compare, T>(comp, val);
}

int main()
{
	vector<int> vec;
	srand(time(nullptr));
	for (int i = 0; i < 20; ++i)
	{
		vec.push_back(rand() % 100 + 1);
	}

	showContainer(vec);
	sort(vec.begin(), vec.end());//默认小到大排序
	showContainer(vec);

	//greater 二元函数对象
	sort(vec.begin(), vec.end(), greater<int>());//大到小排序
	showContainer(vec);

	/*
	把70按顺序插入到vec容器当中   找第一个小于70的数字
	operator()(const T &val)
	greater   a > b
	less      a < b
	绑定器 + 二元函数对象 =》 一元函数对象
	bind1st: + greater bool operator()(70, const _Ty& _Right)
	bind2nd: + less bool operator()(const _Ty& _Left, 70)
	*/
	

	auto it1 = my_find_if(vec.begin(), vec.end(),
		mybind1st(greater<int>(), 70));
	//auto it1 = my_find_if(vec.begin(), vec.end(),bind2nd(less<int>(), 70));
	if (it1 != vec.end())
	{
		vec.insert(it1, 70);
	}
	showContainer(vec);

	return 0;
}

1.3、function函数对象类型的应用示例

在这里插入图片描述
function:函数对象类;

  • 绑定器、函数对象、lambda表达式实际上都是函数对象。
  • 如果我们最终得到的绑定器、函数对象、lambda表达式,这些函数对象,想在多条语句中应用 ,怎么办?如何将这些函数对象的类型留下来?

在这里插入图片描述
源码中希望你用一个函数类型来实例化function模板。

区别函数类型和函数指针类型:

函数指针类型:

  • 是一个指针类型,指向返回值是void,不带形参的函数。
    在这里插入图片描述

函数类型:

  • 我们需要用函数类型来实例化function。
  • 只给出返回值和参数列表即可
    在这里插入图片描述
    无参的hello1函数:
    在这里插入图片描述
    在这里插入图片描述
    用函数对象类型func1将hello1函数类型保留下来了,然后就可以使用func1()调用了。

测试结果:
在这里插入图片描述
对于有参的hello2函数:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
sum函数:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
上面说明,function非常好用,可以直接将函数类型留下来。

function不仅仅可以留下函数类型,也可以留下函数对象类型。(函数对象的本质是()重载函数)

也可以说function是对一个函数/函数对象的包装。
在这里插入图片描述
结果:在这里插入图片描述
上面是对function作用于全局函数,将其函数类型留下来。

当然,function也可以将类的成员方法留下来!
在这里插入图片描述
成员方法的调用必须依赖一个对象。
在这里插入图片描述
在调用时,第一个参数对应传入一个临时对象即可。
在这里插入图片描述
小结:
在这里插入图片描述

function使用举例

funtion的作用:

  • 保留 全局函数、成员函数、其他函数对象的类型,然后再各处都可以使用。
    在这里插入图片描述
    我们使用function,将函数的类型保存下来使用
    在这里插入图片描述
    在这里插入图片描述

问题:这里也可以用函数指针来接收函数的类型吗?

  • 可以接收函数类型;但是只能接收普通的函数,不能接收绑定器绑定的函数对象,也不能接收lambda表达式函数对象。

在这里插入图片描述

#include <iostream>
#include <vector> 
#include <map>
#include <functional>//使用function函数对象类型
#include <algorithm>
#include <ctime>
#include <string>
using namespace std;


void doShowAllBooks() { cout << "查看所有书籍信息" << endl; }
void doBorrow() { cout << "借书" << endl; }
void doBack() { cout << "还书" << endl; }
void doQueryBooks() { cout << "查询书籍" << endl; }
void doLoginOut() { cout << "注销" << endl; }

int main()
{
	int choice = 0;

	map<int, function<void()>> actionMap;
	actionMap.insert({ 1, doShowAllBooks });//老版本:insert(make_pair(xx,xx));
	actionMap.insert({ 2, doBorrow });
	actionMap.insert({ 3, doBack });
	actionMap.insert({ 4, doQueryBooks });
	actionMap.insert({ 5, doLoginOut });

	for (;;)
	{
		cout << "-----------------" << endl;
		cout << "1.查看所有书籍信息" << endl;
		cout << "2.借书" << endl;
		cout << "3.还书" << endl;
		cout << "4.查询书籍" << endl;
		cout << "5.注销" << endl;
		cout << "-----------------" << endl;
		cout << "请选择:";
		cin >> choice;

		auto it = actionMap.find(choice);//map  pair  first second
		if (it == actionMap.end())
		{
			cout << "输入数字无效,重新选择!" << endl;
		}
		else
		{
			it->second();
		}
		//不好,因为这块代码无法闭合  无法做到“开-闭原则”
		/*switch (choice)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		default:
			break;
		}*/
	}

	return 0;
}

1.4、模板的完全特例化和非完全特例化

有完全特例化,就选择对应的完全特例化,有部分特例化,就匹配部分特例化,没有的话,就原模板实例化

模板的完全特例化

在这里插入图片描述
在这里插入图片描述
能运用在int类型上,字符串比较就不行了。
此时的实例化compare代码就不行了,字符串比较的是地址,并不是字典的顺序。

需要多加一个模板的完全特例化:(完全特例化: 类型完全是已知的)

  • template后面的<>什么参数都没有,表示参数都是已知的。
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
模板的部分特例化

原模板实例化:
在这里插入图片描述
完全特例化版本:

  • template后面的<>什么参数都没有,表示参数都是已知的。
    在这里插入图片描述
    部分特例化版本:
  • vector后面知道它是一个指针类型,但不知道具体什么指针,template后面的<>指针类型。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    函数指针的部分特例化:
    在这里插入图片描述
    函数类型的部分特例化:
    在这里插入图片描述
    在这里插入图片描述

区分函数类型和函数指针类型:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <cstdio>
using namespace std;

template<typename T>
class Vector
{
public:
	Vector() { cout << "call Vector template init" << endl; }
};

//下面这个是对char*类型提供的完全特例化版本  #1
template<>//特例化的语法
class Vector<char*>
{
public:
	Vector() { cout << "call Vector<char*> init" << endl; }
};

//下面这个是对指针类a型提供的部分特例化版本  #2
template<typename Ty>
class Vector<Ty*>
{
public:
	Vector() { cout << "call Vector<Ty*> init" << endl; }
};

//指针函数指针(有返回值,有两个形参变量)提供的部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(*)(A1, A2)>
{
public:
	Vector() { cout << "call Vector<R(*)(A1, A2)> init" << endl; }
};

//针对函数(有一个返回值,有两个形参变量)类型提供的部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(A1, A2)>
{
public:
	Vector() { cout << "call Vector<R(A1, A2)> init" << endl; }
};

int sum(int a, int b) { return a + b; }

int main()
{
	Vector<int> vec1;
	Vector<char*> vec2;
	Vector<int*> vec3;
	Vector<int(*)(int, int)> vec4;
	Vector<int(int, int)> vec5;//function

	//注意区分一下函数类型和函数指针类型
	//用函数指针定义的变量本身就是一个指针
	typedef int(*PFUNC1)(int, int);		//PFUNC1是函数指针类型
	PFUNC1 pfunc1 = sum;
	cout << pfunc1(10, 20) << endl;

	typedef int PFUNC2(int, int);		//PFUNC2是函数指针
	//函数类型在定义的时候,需要将指针*加上
	PFUNC2* pfunc2 = sum;
	cout << (*pfunc2)(10, 20) << endl;

	return 0;
}

模板的实参推演

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
程序中添加一个sum函数;
在这里插入图片描述
在这里插入图片描述

程序推导出:
在这里插入图片描述
问题: 上面直接退的函数类型,范围太大了,有返回值类型,还有形参,我们想将返回值和所有形参的类型都取出来;

我们直接用一个函数指针的模板部分特例化来做:
在这里插入图片描述
我们就可以得到细分的类型。
在这里插入图片描述
在这里插入图片描述
定义一个Test类,里面有一个成员函数sum。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得到一个指向成员方法的函数指针类型。
在这里插入图片描述
我们将其参数细分,添加func3函数

我们直接用一个成员方法函数指针的模板部分特例化来做:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <typeinfo>
using namespace std;


int sum(int a, int b) { return a + b; }

//T包含了所有的大的类型  返回值,所有形参的类型都取出来
template<typename T>
void func(T a)
{
	cout << typeid(T).name() << endl;
}

template<typename R, typename A1, typename A2>
void func2(R(*a)(A1, A2))
{
	cout << typeid(R).name() << endl;
	cout << typeid(A1).name() << endl;
	cout << typeid(A2).name() << endl;
}

class Test
{
public:
	int sum(int a, int b) { return a + b; }
};

template<typename R, typename T, typename A1, typename A2>
void func3(R(T::* a)(A1, A2))
{
	cout << typeid(R).name() << endl;
	cout << typeid(T).name() << endl;
	cout << typeid(A1).name() << endl;
	cout << typeid(A2).name() << endl;
}


int main()
{
	func(10);
	func("aaa");
	func(sum);//T  int (*)(int,int)   int (int,int)
	func2(sum);
	func(&Test::sum);//int (__thiscall Test::*)(int,int)
	func3(&Test::sum);

	return 0;
}

总结
  • 这几个例子指导我们在写函数模板,类模板时,针对一个具体情况,把他们一个大类型的细分类型,定义相应的参数,接收大类型的所有细分类型,使用的就是模板部分偏特化。

1.5、function函数对象类型实现原理

通过两个例子:一个是持有普通函数,一个是持有类成员方法;查看类的成员方法到底是什么。

hello函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于sum函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将上面两个模板特例化合并——使用可变参模板。
使用C++11中的可变参;
在这里插入图片描述

#include <iostream>
#include <typeinfo>
#include <string>
#include <functional>
using namespace std;

/*
function函数对象类型的实现原理
*/
void hello(string str) { cout << str << endl; }

int sum(int a, int b) { return a + b; }
///

template<typename Fty>
class myfunction {};

//模板的部分偏特化
template<typename R, typename A1>
class myfunction<R(A1)>
{
public:
	using PFUNC = R(*)(A1);	//需要接受外部传进来的函数类型,使用函数指针接收
	myfunction(PFUNC pfunc) :_pfunc(pfunc) {}
	R operator()(A1 arg)
	{
		return _pfunc(arg);//hello(arg)
	}
private: 
	PFUNC _pfunc;
};

//模板的部分偏特化
template<typename R, typename A1, typename A2>
class myfunction<R(A1, A2)>
{
public:
	using PFUNC = R(*)(A1, A2);
	myfunction(PFUNC pfunc) :_pfunc(pfunc) {}
	R operator()(A1 arg1, A2 arg2)
	{
		return _pfunc(arg1, arg2);//hello(arg)
	}
private:
	PFUNC _pfunc;
};


//可变参模板
template<typename R, typename... A>//一组可变参数个数
class myfunction<R(A...)>
{
public:
	using PFUNC = R(*)(A...);
	myfunction(PFUNC pfunc) :_pfunc(pfunc) {}
	R operator()(A... arg)
	{
		return _pfunc(arg...);//hello(arg) 表示一组形参变量
	}
private:
	PFUNC _pfunc;
};

int main()
{
	function<void(string)> func1(hello);
	func1("hello world!");//func1.operator()("hello world!")

	myfunction<int(int, int)> func2(sum);
	cout << func2(10, 20) << endl;

	return 0;
}

1.6、C++11 绑定器介绍

C++11 bind绑定器 => 返回的结果还是一个函数对象
bind占位符最多有20个参数。

C++11的bind和function比较:

  • function可以直接将函数类型留下来。
  • bind绑定器可以给函数绑定过固定的参数。
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

绑定器问题:

  • 只能使用在语句中,除了语句就不能使用了;

如何将绑定器的类型留下来?

  • 综合运用function和bind。
参数占位符

调用的时候,用户自己传入参数!!!

参数占位符placeholders::_1: 参数具体是什么,不知道,等待用户传递;(最多有20个占位参数)

  • 因此在调用时,必须在()中传入参数;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

绑定器问题:

  • 只能使用在语句中,除了语句就不能使用了;

解决方法:

main函数中:

  • 定义funtion,返回值是void,有一个string形参变量的函数类型,用来记录bind绑定器绑定的结果。
  • 可以通过function函数对象类型,把绑定器的类型留下来,可以重复的去使用。
    在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include <typeinfo>
#include <string>
#include <memory>
#include <vector>
#include <functional>
#include <thread>
using namespace std;
using namespace placeholders;

/*
C++11 bind绑定器 => 返回的结果还是一个函数对象
*/

void hello(string str) { cout << str << endl; }
int sum(int a, int b) { return a + b; }

class Test
{
public:
	int sum(int a, int b) { return a + b; }
};

int main()
{
	//bind是函数模板 可以自动推演模板类型参数 
	bind(hello, "hello bind!")();//bind绑定了一个"hello bind!"参数,
	//返回的结果是绑定器,也就是函数对象, 需要调用它的()重载符号
	cout << bind(sum, 10, 20)() << endl;
	cout << bind(&Test::sum, Test(), 20, 30)() << endl;

	//参数占位符  绑定器出了语句,无法继续使用
	//只是占位的作用,调用的时候就要传递参数了 
	//书写的时候使用多少个占位符,就是意味着用户调用的时候要传入几个参数
	bind(hello, _1)("hello bind 2!");
	cout << bind(sum, _1, _2)(200, 300) << endl;

	//此处把bind返回的绑定器binder就复用起来了
	function<void(string)> func1 = bind(hello, _1);
	func1("hello china!");
	func1("liu feng ni hao");

	return 0;
}

std::bind()函数详解 阅读详情

相关推荐

【从零开始学Skynet】基础篇(一):Skynet环境搭建

Skynet运行于Linux操作系统,我们可以在自己的电脑上搭建虚拟机系统,也可以购买阿里云、腾讯云服务器,笔者这个系列的所有代码都是在Ubuntu16.04版本的虚拟机系统下运行编辑。

我是一条寻水的鱼 3167

C++11-std::bind

本文介绍了c++11中的std::bind的使用

xiaoqiang321的专栏 3868

海康视觉相机驱动软件MVS参数配置全攻略(附接线图+避坑指南)

本文提供了海康视觉相机驱动软件MVS从硬件连接到软件参数配置的完整指南。详细解析了供电与通讯线缆的区分、PNP/NPN信号逻辑的接线避坑方法,并重点阐述了MVS软件中触发模式、网络IP配置、图像采集及光源控制等核心参数的设置技巧,旨在帮助用户快速完成相机调试,实现稳定高效的图像采集。

weixin_29204205的博客 389

C++之function和bind用法

C++11特性function和bind的用法

axyw_的博客 1669

手把手教你用gym训练宇树GO2机器人模型(附完整配置文件)

本文提供了一份详细的实战指南,教你如何使用Gym框架为宇树GO2四足机器人搭建强化学习训练环境。文章深入解析了环境配置、参数调试、奖励函数设置等关键步骤,并分享了避开常见陷阱的经验,旨在帮助开发者高效完成模型训练。

oo7890的博客 321

CATIA二次开发CAA安装

安装资料在网盘里 Win7 64位 以下软件均已管理员身份运行: 1.安装vs2008->自定义安装->选择要安装的功能->Visual C+±>x64编译器和工具 1.2安装SP1 2.安装CATIA V5 R21->win7_XP->CATIA.P3.V5R21.Win64->setup.exe 2.1安装目录改为D盘 2.2环境目录位置默认 3.安装...

qq_39311458的博客 4631

(原创)C++11改进我们的程序之简化我们的程序(五)

这次要讲的是:c++11中的bind和function std::function 它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针。以统一的方式处理函数、函数对象、函数指针、和成员函数。允许保存和延迟执行函数。 函数和成员函数作为function void G(); struct A { void H(){...

weixin_34241036的博客 354

Go语言Gin框架项目:从零到一搭建一个用户管理系统

本文介绍了一个基于Go语言Gin框架开发的用户管理系统。系统采用MySQL数据库存储数据,使用Bootstrap 5构建现代化UI界面,实现了完整的CRUD功能。主要特点包括:RESTful API设计、前后端双重表单验证、实时搜索功能、SQL防注入措施以及响应式布局。项目结构清晰,包含数据库配置、用户模型、处理器和前端模板等模块。系统提供用户列表展示、新增/编辑表单、删除确认等功能,通过参数化查询确保安全性,并支持按姓名或邮箱搜索用户。

数据知道的博客 3994

C++11新特性——std::bind参数绑定

据不知名人士透露,《带注释的C++参考手册》这本书对 C++ 98 标准的制定产生了很大的影响。但是是用于将已有变量绑定到可调用函数的参数上。早在C98中,就有两个函数bind1st和bind2nd,他们被用于绑定已有变量到可执行函数的第一个参数和第二个参数,相同的是他们都只能绑定一个参数。当然类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。这部分比较重要的就是要明白普通函数和类成员函数有什么区别,我们都知道的是在函数指针上面,类成员函数指针。

木牛的博客 2450

全栈拆解华为乾崑 ADS 5:WEWA2.0智能体架构与安全风险场技术、实现多传感器全融合感知与主动安全预判、助力城市NOA/高速领航/全场景无人通行极致落地

华为乾崑ADS 5的核心颠覆性,不在于单一功能的小幅升级,而在于实现了自动驾驶从“工具式辅助驾驶”到“拟人化智能体驾驶”的全栈范式革命。通过WEWA 2.0端云协同AI智能体架构,解决了传统智驾决策僵硬、博弈能力弱、学习效率低的行业痛点;通过行业首发安全风险场技术,将自动驾驶安全体系从被动避险升级为主动预判,直接减半行车风险;通过乾崑OS专属车规系统底座,保障高阶智驾的低时延、高稳定、高可靠运行;通过多传感器超融合感知体系,实现全场景、全天候、无盲区的精细化环境理解。

getusushu的博客 287

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3633

[C++高级部分]C++11中引入的bind绑定器和function函数对象

C++11 引入的 bind绑定器和function函数对象

下酒番陪绅士的博客 425

16、SQL Server索引的创建与评估

本文详细介绍了SQL Server中索引的创建与评估方法,涵盖索引的基本概念、类型(聚集与非聚集)、唯一性设置以及如何判断索引的好坏。通过实际操作步骤、维护策略和常见问题解决方案,帮助数据库开发者合理设计索引,提升查询性能并控制维护开销。同时提供了索引创建与维护的决策流程图,便于理解和应用。

water的专栏 126

C++11 std::bind函数,std::function函数

文章目录一、std::bind函数的简单介绍二、使用 一、std::bind函数的简单介绍 std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存. std::bind主要有以下两个作用: 将可调用对象和其参数绑定成一个仿函数; 只绑定部分参数,减少可调用对

Jqivin的博客 1599

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

std::function绑定全局静态类成员函数

来源:微信公众号「编程学习基地」 文章目录std::function 绑定函数绑定全局函数绑定静态函数绑定类的成员函数std::function和C语言函数指针对比 std::function 绑定函数 绑定全局函数 #include <iostream> #include <functional> using namespace std; function<void(char*)> functionTest; void funTest(char* infoStr..

deroy 1849

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++绑定器和函数对象

非学无以广才,非志无以成学。C++绑定器和函数对象。

丹尼酷特纳的博客 282

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++11实用技术(二)std::function和bind绑定器

C++11新增了std::function和std::bind。用于函数的包装以及参数的绑定。可以替代一些函数指针回调函数的场景。

weixin_44477424的博客 1389

c++ bind函数与function函数简介及使用方法

c++十一标准bind的简单使用介绍

weixin_61899680的博客 2825

c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别

针对标题的两种情况,使用起来有一定的特殊性,特此记录下。 至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章。 标题的两种情况看下面的例子直接学习用法即可,用法也很直观简单,不得不说,C++11的bind的真是太牛叉了! #include <iostream> #include <functional> #include <typeinfo> using namespace std; using namespace placeholders; cl

Twoton的博客 995

C++11中的function和bind

概念:bind是 C++11 标准库中的一个函数模板,它定义在 头文件中。bind的主要作用是接收一个可调用对象,将可调用对象的参数进行绑定或重新排列后,返回一个新的可调用对象,这个新的可调用对象在调用时会将绑定的参数传递给原始的可调用对象。我们可以这样理解bind:将bind看做是一个通用的函数适配器,它接收一个可调用对象,生成一个新的可调用对象 来适应原对象的参数列表。function是对可调用对象的再封装。

知其然 知其所以然 1149

[C++] C++11详解 (五)function包装器、bind绑定

arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们。可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。在调用的时候,_1代表传给Newdiv函数参数的第一个,_2代表传给Newdiv函数参数的第二个;数值n表示生成的可调用对象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推。,arg_list是一个逗号分隔的参数列表,对应给定的。

石墨博客 1428

C++11 bind和function总结

C++11提供了lambda表达式,bind和function,如果想要在程序中使用bind和function需要引入头文件functional,下面简要的介绍一下这几个利器. 举个栗子看看他们都是怎么使用的: #include <iostream> #include <functional> #include <string> using namespace std; class Base { public: Base() = delete;

哆啦A瑶的博客 1267

C++学习笔记:函数绑定器(bind用法)

STL绑定器bind 成员函数绑定器mem_fn

qq_45834144的博客 3685

突破编程_C++_C++11新特性(function与bind绑定器)

C++11 新特性:function与bind绑定器

突破编程 1517

C++11函数绑定

函数绑定:1.函数对象 (1.1)能够被当做函数调用的不一定就是函数,它们也可能是: A.存放函数入口地址的函数指针 B.实现了小括号运算符的类对象,亦称仿函数 C.可被转换为函数指针的类对象 (1.2)可调用对象,像函数指针,仿函数以及可被转换为函数指针的类对象都被称为可调用对象,而他们的类型就被称为可调用类型 (1.3)函数对象,函数对象实际上是一个function类模板的实例化对象,其...

weixin_34397291的博客 358

C++11特性:可调用对象绑定器的使用

在上面的程序中,使用了std::bind绑定器,在函数外部通过绑定不同的函数,控制了最后执行的结果。std::bind绑定器返回的是一个仿函数类型,得到的返回值可以直接赋值给一个std::function,在使用的时候我们并不需要关心绑定器的返回值类型,使用auto进行自动类型推导就可以了。可调用对象包装器std::function是不能实现对类成员函数指针或者类成员指针的包装的,但是通过绑定器std::bind的配合之后,就可以完美的解决这个问题了,再来看一个例子,然后再解释里边的细节:。

qq_73185160的博客 1003
上一篇: 116-MySQL(redo log重做日志)
下一篇: 118-B-树& B+树 & B*树
ThinkingF
博客等级 码龄7年 1230粉丝 482原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkingF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值