码迷,mamicode.com
首页 > 其他好文 > 详细

boost在lambda表达式中调用占位符参数的成员函数的方法

时间:2014-05-25 21:56:52      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:c++   boost   lambda   

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数。

我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost。但是我用的时候才发现,boost的lambda表达式居然不支持在占位符参数上调用函数,在网上找了很久也没有发现相关的文章。最后在boost的官方文档中找到了解决方法,可是这种方案只能简单的调用函数,无法对函数的返回值做任何操作,但是有时候可能要对函数返回值做一些比较之类的,就不行了。其使用这种方法调用函数纯属多此一举,使用bind可以达成同样的功能,而且bind可以识别出智能指针。

这是boost官方实例,注意,使用_1时一定要限定boost::lambda命名空间,不然会编译错误。

struct B { int foo(int); };
B* b = new B();
  ...
(b ->* &B::foo)         // returns a delayed call to b->foo
                        // a function argument list must follow
(b ->* &B::foo)(1)      // ok, calls b->foo(1)

(_1 ->* &B::foo)(b);    // returns a delayed call to b->foo, 
                        // no effect as such
(_1 ->* &B::foo)(b)(1); // calls b->foo(1)



最后只能找其他方法,最后终于被我想到了一种代替的方法,但是还是有一些缺陷,但是做一些简单的调用还是可以的,在此分享出来,也算填补一个空白。

其核心思想就是在lambda表达式中使用bind来绑定占位符参数做一个调用来完成调用函数的功能,但是还是有些缺陷,后面会讲。

看代码

#include <iostream>
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/function.hpp>

class A
{
public:
    int a;
    int b;
  virtual int  test()
  {
      std::cout<<"A"<<std::endl;
      return 1;
  }
};




class B:public A
{
    int c;
    virtual int test()
    {
        std::cout<<"B"<<std::endl;
        return 2;
    }
};

void test(A* p)
{
    p->test();
}

int main()
{
//boost 官方示例用法,但是调用函数的返回值不能在进行任何运算,否则会编译错误,坑啊
   std::cout<< ((boost::lambda::_1 ->* &A::test)) (new B)();
    //智能指针,没错,bind很强大,能绑定虚函数,甚至能识别出智能指针
    boost::shared_ptr<A>o= boost::make_shared<B>();
    //在lambda中使用bind调用占位符参数的test方法
    std::cout<<( (boost::bind(&A::test,_1)<=2)(o) );
    //这就是我说的缺陷了,如果要对bind表达式的结果进行运算,只能把bind表达式放在运算符左边,巨坑啊
    //std::cout<<((2>boost::bind(&A::test,_1))(o));
    //这是另一个缺陷,如果要对bind表达式的结果进行运算,只支持比较操作符,就是<、>、==等比较操作符,
    //不支持+、-、*、/等运算符,坑到底啊
    //std::cout<<((boost::bind(&A::test,_1)+1)(o));
    
    getchar();
    
}

虽然找到了替代用法,但是还是有很多限制,只能把bind表达式放在运算符左边,只支持比较操作符,但在一些简单的比较场合,比如stl算法,已经够用了,总比以前好点。

 由于本人水平有限,难免会有些考虑不周之处,敬请指证!仅以此文以表我对这个问题的看法,希望能和大家交流交流,谢谢 !


boost在lambda表达式中调用占位符参数的成员函数的方法,布布扣,bubuko.com

boost在lambda表达式中调用占位符参数的成员函数的方法

标签:c++   boost   lambda   

原文地址:http://blog.csdn.net/bjrxyz/article/details/26567405

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!