码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-18 19:00:46      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:函数对象   lam   cmem   mes   遇见   class   more   模版   namespace   

第一次遇见

在《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

标签:函数对象   lam   cmem   mes   遇见   class   more   模版   namespace   

原文地址:https://www.cnblogs.com/zhanghengyu/p/10886358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!