什么是std::function以及如何使用stdLLfunction

Posted zhanghengyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是std::function以及如何使用stdLLfunction相关的知识,希望对你有一定的参考价值。

第一次遇见

在《More Effective Morden C++》中Item5“Prefer auto to explicit type declarations.”里有这样一段代码

std::function<bool (const std::unique_ptr<Widget>& , const std::unique_ptr<Widget>&)>
dereFUPLess = [] (const std::unique_ptr<Widget>& p1, const std::unique_ptr<Widget>& p2)
{return *p1<*p2 ;};

后面的 dereFUPLess 是一个lamda表达式

 

std::function是什么?

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。

简单的说:通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。

如何使用std::function?

 1 #include <functional>//它的头文件
 2 #include <iostream>
 3 using namespace std;
 4 
 5 std::function< int(int)> Functional;
 6 
 7 // 普通函数
 8 int TestFunc(int a){return a;}
 9 
10 // Lambda表达式
11 auto lambda = [](int a)->int{ return a; };
12 
13 // 仿函数(functor)
14 class Functor{
15 public:
16     int operator()(int a){return a;}
17 };
18 
19 // 1.类成员函数
20 // 2.类静态函数
21 class TestClass{
22 public:
23     int ClassMember(int a) { return a; }
24     static int StaticMember(int a) { return a; }
25 };
26 
27 int main(){
28     // 普通函数
29     Functional = TestFunc;
30     int result = Functional(10);
31     cout << "普通函数:"<< result << endl;
32 
33     // Lambda表达式
34     Functional = lambda;
35     result = Functional(20);
36     cout << "Lambda表达式:"<< result << endl;
37 
38     // 仿函数
39     Functor testFunctor;
40     Functional = testFunctor;
41     result = Functional(30);
42     cout << "仿函数:"<< result << endl;
43 
44     // 类成员函数
45     TestClass testObj;
46     Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
47     result = Functional(40);
48     cout << "类成员函数:"<< result << endl;
49 
50     // 类静态函数
51     Functional = TestClass::StaticMember;
52     result = Functional(50);
53     cout << "类静态函数:"<< result << endl;
54 
55     return 0;
56 }

 

  • 关于可调用实体转换为std::function对象需要遵守以下两条原则:
    • 转换后的std::function对象的参数能转换为可调用实体的参数;
    • 可调用实体的返回值能转换为std::function对象的返回值。
  • std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较。

以上是关于什么是std::function以及如何使用stdLLfunction的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 std::function 传递给 std::async

C11新特性之std::function与std::bind

muduo库中的核心:std::bind和std::function

如何在 std::function 的参数中进行可变参数推导?

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

为啥不执行 std::function