C++——C++11新语法(下)

一、包装器

1、function

std::function是一个类模板,也是一个包装器。std::function可以包装存储其他可以调用的对象,比如函数指针、仿函数对象、lambda、bind表达式等等,存储的可调用对象被称为std::function的目标,如果std::function没有目标,那么就说这个std::function是空的。在调用空std::function的目标时会导致抛出异常。std::function被包含在<functional>的头文件中。当有一个函数指针、仿函数、lambda的可调用对象需要的参数和返回值都相同时,他们的类型都是不同的,当我们使用一个function来包装时,这样在很多东西声明可调用对象的类型的时候就会很方便。

这里需要注意的是,function包装的是可调用的对象,在保证某个类的普通成员函数时,首先要指定类域并且在前面加上&才能获取到地址,同时类的普通成员变量有一个隐式的第一个参数 this指针,在使用function包装时要写上,绑定的时候传对象或者对象指针都可以,不然会发生类型不匹配的问题。在包装类的静态成员函数时也要指定类域并且在前面加上&才能获取到地址,但是静态成员函数没有this指针,所以不需要加那个对象或者对象指针的参数。

cpp 复制代码
#include<iostream>
#include<functional>
using namespace std;

//仿函数
struct Func
{
	int operator()(int a, int b)
	{
		return a + b;
	}
};

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

class Plus
{
public:
	int plus1(int a, int b)
	{
		return a + b;
	}

	static int plus2(int a, int b)
	{
		return a + b;
	}
};


int main()
{
	//包装lambda
	function<int(int, int)> f1 = [](int a, int b) {return a + b; };

	//包装函数
	function<int(int, int)> f2 = f;

	//包装仿函数对象
	function<int(int, int)> f3 = Func();

	//包装静态成员函数
	function<int(int, int)> f4 = &Plus::plus2;

	//包装普通成员函数
	function<int(Plus, int, int)> f5 = &Plus::plus1;

	return 0;
}

2、bind

bind是一个函数模板,它也是一个可调用对象的包装器,可以把他看作是一个函数适配器,也可以接收function的对象进行处理后返回一个可调用对象。bind还可以用来调整参数的个数和顺序。bind 也在<functional>这个头⽂件中。

调⽤bind的⼀般形式: auto newCallable = bind(callable,arg_list); 其中newCallable本⾝是⼀个可调⽤对象,arg_list是⼀个逗号分隔的参数列表,对应给定的callable的参数。当我们调用newCallable时,newCallable会调⽤callable,并传给它arg_list中的参数。

arg_list中的参数可能包含形如_n的名字,其中n是⼀个整数,这些参数是占位符,表⽰ newCallable的参数,它们占据了传递给newCallable的参数的位置。数值n表⽰⽣成的可调⽤对象 中参数的位置:_1为newCallable的第⼀个参数,_2为第⼆个参数,以此类推。_1/_2/_3....这些占 位符放到placeholders的⼀个命名空间中。

这里有一个有一个使用技巧,那就是用bind包装function,前面在说function包装一个类的普通成员函数的时候需要在第一个参数的位置传入这个对象或者对象的指针,在调用的时候就会很别扭,我们可以用bind在这里把第一个参数写死了,以后在调用的时候就像一个仿函数的调用形式了。

cpp 复制代码
using placeholders::_1;
using placeholders::_2;

class Plus
{
public:
	int plus1(int a, int b)
	{
		return a + b;
	}

	static int plus2(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	function<int(Plus, int, int)> f = &Plus::plus1;

	auto ff = bind(f, Plus(), _1, _2);

	cout << ff(1, 2) << endl;
	return 0;
}

二、智能指针

智能指针是一块比较大的内容,后续会单独再写一篇博客专门讲智能指针。

相关推荐
YaoYuan93232 小时前
C++ 类型推导(第一部分)
c++
HAH-HAH2 小时前
【Python 入门】(2)Python 语言基础(变量)
开发语言·python·学习·青少年编程·个人开发·变量·python 语法
递归不收敛2 小时前
一、Java 基础入门:从 0 到 1 认识 Java(详细笔记)
java·开发语言·笔记
夜猫逐梦3 小时前
【VC】 error MSB8041: 此项目需要 MFC 库
c++·mfc
纪元A梦3 小时前
贪心算法应用:配送路径优化问题详解
算法·贪心算法
zhangfeng11333 小时前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息
姓刘的哦4 小时前
Qt中的QWebEngineView
数据库·c++·qt
C_player_0014 小时前
——贪心算法——
c++·算法·贪心算法
SundayBear4 小时前
QT零基础入门教程
c++·qt
子午5 小时前
Python的uv包管理工具使用
开发语言·python·uv