zoukankan      html  css  js  c++  java
  • STL中mem_fun和mem_fun_ref的用法

    例如:假设有如下的代码:
    class Employee
    {
    public:
     int DoSomething(){}
    }
    std::vector<Employee> Emps;
    假设我们要调用Emps里面所包含的所有Employee的DoSomething();一般初学者会这样调用:
    for (std::vector<Employee>::iteror it=Emps.begin(); it!=Emps.Ends(); it++)
    {
     (*it).DoSomething();
    }
    而定义一个全局的仿函数,使用STL中的for_each的用法也是司空见惯的,如:
    int GiveDoSomething(Employee& e)
    {
     return e.DoSomething();
    }
    std::for_each(emps.begin(),emps.end(),&GiveDoSomething);
    但是这种访问方式需要单独定义一个全局的仿函数GiveDoSomething.而有没有办法直接调用Employee中对应的成员函数的话?答案是这样子:
    std::vector<Employee> emps;
    std::for_each(emps.begin(),emps.end(),std::mem_fun_ref(&Employee::DoSomething));
    而倘若容器中包含的是指向对象的指针,你就应该使用mem_fun:
    std::vector<Employee> emp_ptrs;
    std::for_each(emp_ptrs.begin(),emp_ptrs.end(),std::mem_fun(&Employee::DoSomething));
    不过有一点要注意,请看DoSomething函数是无参的,而对于有一个参数的函数,可以使用std::bind...辅助函数,使用原则和mem_fun一样。然而遗憾的是,这种做法不适应那些接受两个或多个参数的函数,但是这并不代表mem_fun一无用处。
    但是mem_fun这些特质同样会带给我们一些尴尬的事情,例:
    std::mem_fun(&(std::vector<int>::clear))
    std::vector<int>::clear()的函数参数是无参的,返回void.这样调用会成功吗?
    C++标准里面关于标准库的部分在描述某些成员函数的实现时故意留了一些余地。尤其是下面这两句话:
    1.一个具有默认参数的成员函数签名可以被“两个或多个具有等价行为的成员函数签名”所替代
    2.成员函数签名可以具有额外的默认参数
    上面的第二句话就是问题所在,即那些可有可无,若隐若现的额外参数就是肇事者,Herb Sutter称之为(peekaboo(
  • 相关阅读:
    printf语句中%p ,%#x区别
    Ant执行一个含有main方法的class文件
    aix 扩展文件系统
    ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)
    oracle创建表空间语句分解
    Oracle10g/11g 在SUSE/RHEL上的安装与配置
    15个实用的Linux find命令示例
    suse安装软件命令
    如何把.rar文件隐藏在一个图片内
    windows 7 中将“我的电脑”锁定到任务栏
  • 原文地址:https://www.cnblogs.com/zendu/p/4987949.html
Copyright © 2011-2022 走看看