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表达式中调用占位符参数的成员函数的方法
原文地址:http://blog.csdn.net/bjrxyz/article/details/26567405