C++11 学习笔记之std::function和bind绑定器
概述
C++11引入了新的STL库,其中包含<functional>
头文件,提供了一些与函数相关的新功能:std::function
和std::bind
。这两个功能的使用可以使得C++中的函数更加灵活,便于使用。
std::function
是一个通用的函数封装,可以存储、复制及调用任何可调用(可调 用是指函数、函数指针、函数对象、lambda表达式)的对象。std::bind
是一个通用的函数适配器,它能够把一个函数转变为一个可调用的对象。
std::function的使用
在使用std::function
之前,需要#include<functional>
头文件。
#include <iostream>
#include <functional>
int add(int a, int b)
{
return a + b;
}
int main()
{
std::function<int(int, int)> f = add;
std::cout << f(1, 1) << std::endl;
}
上述代码展示了一个简单的示例,将add
函数作为参数,创建了一个std::function
对象f,并对其进行调用。可以看到,在调用f
的时候,直接将参数传递给f
即可,其余工作都已经被std::function
对象简化掉。
#include <iostream>
#include <functional>
class Test
{
public:
int operator()(int a, int b)
{
return a * b;
}
};
int main()
{
Test t;
std::function<int(int, int)> f = t;
std::cout << f(2, 3) << std::endl;
}
上述代码展示了另一个示例,使用一个函数对象作为参数创建了一个std::function
对象f,并对其进行调用。同样的,在调用f
时,直接将参数传递给f
,其余工作由std::function
对象简化掉。
在使用std::function
时,需要注意函数参数和返回值的类型及数量,必须与创建std::function
对象时的参数和返回值类型相匹配。
std::bind的使用
std::bind
函数可以把一个函数和一些参数包装成一个可调用对象,并返回这个对象。如果将它的返回值赋值给一个std::function
对象,就可以像使用函数一样使用该函数对象。下面的示例演示了如何使用std::bind
函数:
#include <iostream>
#include <functional>
int add(int a, int b)
{
return a + b;
}
int main(void)
{
auto f1 = std::bind(add, 1, 2);
auto f2 = std::bind(add, std::placeholders::_1, std::placeholders::_2);
std::cout << f1() << std::endl;
std::cout << f2(3, 4) << std::endl;
return 0;
}
上述代码中,std::bind
函数将add
函数和参数1
、2
或std::placeholders::_1
、std::placeholders::_2
打包成了可调用对象。第一个std::bind
将add
函数与参数1
、2
打包成了可调用对象f1
,第二个std::bind
将add
函数和两个占位符(std::placeholders::_1
和std::placeholders::_2
)打包成了可调用对象f2
。在调用f1
时,不需要传递参数,因为参数已经在std::bind
函数的时候被绑定了;而在调用f2
时,需要传递两个参数,它们分别对应着占位符std::placeholders::_1
和std::placeholders::_2
。
总结
std::function
和std::bind
是C++11引入的两个重要功能,它们使得函数对象的创建和使用变得更加简单和灵活。在使用时,需要注意函数参数和返回值的类型和数量需与创建对象时的参数和返回值类型相匹配。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11 学习笔记之std::function和bind绑定器 - Python技术站