• std::tr1::bind和std::tr1::function的用法


    除了std::tr1::bind,另外有一个boost::bind,这个应该与boost中其他的数据结构结合的很紧。后者好像用的更多。(boost::function和boost::bind已经纳入了std::tr1,所以这两者应该是一样的

    bind使用形式

    bind(&f)()  假设f是一个全局函数,绑定全局函数并调用

    bind (&A::f, A())()  假设A是一个构造函数为空的类,这个形式绑定了类的成员函数,故第二个参数需要传入一个成员。(成员静态函数除外)

    bind (&A::f, _1)(new A()) 同上,效果是一样的,但是使用了占位符,使得没有固定的的对象,推荐

    绑定带返回值的简单使用例子

    #include <stdio.h>
    #include <tr1/functional>
    
    using std::tr1::function;
    using std::tr1::bind;
    
    int func(int x,int y) {
        printf("nimei x:%d y:%d\n", x, y);
        return 3;
    }
    int main() {
        printf("%d\n", bind<int>(&func, 3, 4)());
        return 0;
    }

    使用的时候一定要注意指向的是没有this指针的函数(全局函数或静态成员函数),还是有this指针的函数。后面一种必须要用bind()函数。而且要多一个参数

    bind(F f, T1 t1, T2 t2, ..., TN tN);

    具体为:

    bind(&要调用的函数,&对象, 要调用函数的参数1,要调用函数的参数2...,_1(bind函数的参数1),_2(bind函数的参数2)...)


    如果bind的是一个非静态成员函数,第二个参数一定是一个该成员的一个指针,后面才是正常的参数。

    bind中,如果有占位符,那么bind返回的就是相应的参数的函数。比如_1 代表的是int型的参数,那么bind返回的就是void (int),假设绑定的时候返回值为void

    如果在一个pool中使用bind,那么相应的函数实现可以在其他地方实现而不在pool类中实现,而在其他类中实现,这样可以保持pool的简洁性。
     

    注:

    1.typedef function<void(FrameworkPtr)> FrameworkFunc  这个定义代表FrameworkFunc是一个有一个FrameworkPtr为参数,无返回的函数。

    2.“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。

    3 如果没有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为”(myan语),简直就无敌了。

  • 相关阅读:
    [BZOJ1015] [JSOI2008]星球大战starwar
    [BZOJ2321,LuoguP1861]星(之)器
    Google Search Operators
    Python blockchain
    CCAE词频表(转)
    python小技巧(转)
    Python著名的lib和开发框架(均为转载)
    Yarn取代job/task tracker
    hadoop 2.73‘s four xml
    HDFS NN,SNN,BN和HA
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2875920.html
Copyright © 2020-2023  润新知