zoukankan      html  css  js  c++  java
  • 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/

    我的理解:

    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()<<'
    ';
    42   std::cout << five.triple('a') << '
    ';
    43   std::cout<<afive.triple('a', 'b')<<'
    ';
    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') << '
    ';
    53   
    54 
    55   return 0;
    56 }

    运行结果如下:

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

  • 相关阅读:
    pl/sql developer 布局结构保存
    pl/sql developer 快捷操作: 显示不可见字符 显示历史sql语句 拷贝整个sql窗口的语句至新的sql窗口
    pl/sql developer 自带汉化选项
    Unix(AIX) set命令
    PAT 1004 To Fill or Not to Fill (25)
    “command line option syntax error,Type command/?for help
    以前的笔记迁移__形參,实參,递归
    清河好程序猿训练营是什么?
    Linux多线程实践(三)线程的基本属性设置API
    Linux定时器工具-crontab 各參数具体解释及怎样查看日志记录
  • 原文地址:https://www.cnblogs.com/azbane/p/15364621.html
Copyright © 2011-2022 走看看