STL 算法 std::mem_fn

std::for_each(threads.begin(),threads.end(), std::mem_fn(&std::thread::join));

1. 说明

2. 写用法

3.写样例

 

直接参考 cplusplus官网讲解:http://www.cplusplus.com/reference/functional/mem_fn/

STL 算法 std::mem_fn

 

我的理解:

std::mem_fn 把一个成员函数转换成一个可调用的函数对象。函数对象的功能是借助成员函数来实现的。

这个函数对象具备一下几个特点:

1. 函数对象类型重载的可调用运算符函数的第一个参数是成员函数对应的类类型的变量,或指针或引用。如果成员函数有参数,可调用运算符函数的第二个参数起,每个参数与成员函数的参数一一匹配。

2.函数对象类型有一个成员变量(result_type), 即是成员函数的返回值类型。

3.如果成员函数没有参数,函数对象类型有一个成员变量(argument_type),即是成员函数对应的类类型。

4.如果成员函数有参数,函数对象类型有一个成员变量(first_argument_type),即是成员函数对应的类类型;还有一个成员变量(second_argument_type),即是成员函数第一个参数的类型

 5.函数对象类型的几个操作是异常安全的,包括移动构造函数,拷贝构造函数,拷贝赋值运算符,他们都是不跑出任何异常的。

练习代码如下:

 1 // mem_fn example
 2 #include <iostream>     // std::cout
 3 #include <functional>   // std::mem_fn
 4 #include <typeinfo>
 5 
 6 struct char_holder {
 7   char value;
 8   char triple() {   //无参成员函数
 9       std::cout<<"call char_holder"<<std::endl;
10       return value;
11       }
12 };
13 
14 
15 struct int_holder {
16   int value;
17   int triple(char a) { //一个参数的成员函数
18       std::cout<<"call int_holder with one paramter a is "<<a<<std::endl;
19       return value*3;
20       }
21 };
22 
23 
24 struct char_int_holder {
25   char cr;
26   int value;
27   int triple(char a, char b) { //两个或多个参数的成员函数
28       std::cout<<"call char_int_holder with two paramter a is "<<a<<" b is "<<b<<std::endl;
29       return value*3;
30       }
31 };
32 
33 
34 
35 int main () {
36   char_holder aaa{'a'};
37   int_holder five {5};
38   char_int_holder afive {'a', 5};
39 
40   std::cout<<"call member directly==========="<<std::endl;
41   std::cout<<aaa.triple()<<'n';
42   std::cout << five.triple('a') << 'n';
43   std::cout<<afive.triple('a', 'b')<<'n';
44 
45   std::cout<<"same as above using a mem_fn=========="<<std::endl;
46   auto charTriple = std::mem_fn(&char_holder::triple);
47   auto intTriple = std::mem_fn (&int_holder::triple);
48   auto charIntTriple = std::mem_fn(&char_int_holder::triple);
49   
50   std::cout<<charTriple(aaa)<<std::endl;
51   std::cout<<intTriple(five, 'a')<<std::endl;
52   std::cout <<charIntTriple(afive, 'a', 'b') << 'n';
53   
54 
55   return 0;
56 }

运行结果如下:

STL 算法 std::mem_fn

 

 

原创文章, 转载请注明出处!

 

原文链接: https://www.cnblogs.com/azbane/p/15364621.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    STL 算法 std::mem_fn

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398284

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月12日 上午9:36
下一篇 2023年4月12日 上午9:36

相关推荐