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 }

    运行结果如下:

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

  • 相关阅读:
    Android SDK 国内镜像及配置方法
    Python多线程学习
    JProfiler 8下载地址和注册码
    Python自动化测试工具Splinter简介和使用实例
    linux系统新建用户ssh远程登陆显示-bash-4.1$解决方法
    Linux系统安装VMware Tools
    CentOS minimal网络设置
    接口测试之webservice
    VirtualBox-Linux系统安装增强功能
    PhantomJS快速入门
  • 原文地址:https://www.cnblogs.com/azbane/p/15364621.html
Copyright © 2011-2022 走看看