免费刷网站百度关键词,品牌网站建设 蝌蚪小7,做外贸大大小小的网站有哪些,网站建设seo优化的好处C98里面的可调用对象只有普通函数和函数指针。 而在C11里面可调用的对象有下面几种#xff1a;
普通函数函数指针仿函数lambda表达式#xff08;匿名函数#xff09;包装器 普通函数、函数指针、仿函数、lambda表达式我在以前的文章里其实已经介绍过了
包装器
在C11里面有…C98里面的可调用对象只有普通函数和函数指针。 而在C11里面可调用的对象有下面几种
普通函数函数指针仿函数lambda表达式匿名函数包装器 普通函数、函数指针、仿函数、lambda表达式我在以前的文章里其实已经介绍过了
包装器
在C11里面有多种类型的可调用对象包装器可以将这些对象包装起来给我们提供一个统一的视角。相当于给外面再套了一层盒子。
包装器的定义
//1
template class T function; // undefined
//2
template class Ret, class... Args
class functionRet(Args...);它的定义貌似很奇怪包装器提供了模板2是1的特化Ret指出可调用对象的返回值类型并且给我们提供了可变参数用一个省略号...指出模板参数或函数参数是一个包。 function包含在头文件functional里面而且在std域里 包装方式function返回类型(参数类型1参数类型2...., 参数类型n) name 可调用对象 使用方式name(参数1, 参数2, ...参数n) 使用方式类似于函数 例一包装普通函数
#include iostream
#include functional
using namespace std;int f(int x, int y)
{return x - y;
}
int main(void)
{//用包装器包装起来functionint(int, int) f1 f;cout f1(2, 1) endl;return 0;
}例二包装lambda表达式 //包装可调用对象lambda表达式functionint(char, char, char) f2 [](char e1, char e2, char e3)mutable-int{return e1 - e2 e3;};cout f2(z, a, x) endl;例三包装仿函数
class Student
{
public://重载(),仿函数char operator()(string str){return str[0];}
};//包装可调用对象仿函数functionchar(string) f3 Student();cout f3(hello) endl;在某些情况下我们可能需要提供一个统一的接口来接收这些类型就需要使用到包装器。 包装器一般会和std::bind结合使用
std::bind
std::bind在包装器中有如下作用 作用1调整参数顺序 作用2调整参数个数
simple(1)
template class Fn, class... Args
bind (Fn fn, Args... args);with return type (2)
template class Ret, class Fn, class... Args
bind (Fn fn, Args... args);bind在包装器里面的作用简单来说就是利用旧的可调用对象创建了一个新的。第一个参数是一个万能引用用来接收可调用对象而它使用后面的参数包指明新对象的函数参数。
int f(int x, int y)
{return x - y;
}//用包装器包装起来functionint(int, int) f1 f; //普通函数cout f1(2, 1) endl;//使用bindfunctionint(int, int) ff1 bind(f, placeholders::_1, placeholders::_2);cout ff1(2, 1);在使用std::bind的时候使用placeholders::_n指明旧的可调用对象的参数n对应参数在原来的参数列表里是第几个。这里的placeholders::_1指的就是x。
那么我们可以利用bind来调整参数的顺序
functionint(int, int) ff1 bind(f, placeholders::_2, placeholders::_1);一些特定情况下某个参数的值是固定的。调整参数的个数实际上调整的是bind新创建对象的参数。 functionint(int) f4 bind(f, 95, placeholders::_1);cout f4(12) endl;对于对象f来说它调用的时候需要两个int类型的参数。当我们进行如上操作的时候将第一个参数固定成了95调用的时候就只需要传递一个参数就可以。 使用bind调整参数个数时需要注意
如果想要固定某一个参数在bind的时候需要指明指明以后placeholders::_X这个X从旧可调用对象的下一个参数开始算起。function也需要做相应的改变实例化的时候用bind固定的参数类型不需要再写进来。