C++指针探讨(三)成员函数指针
(A(2)); va.push_back(A(3)); va.push_back(A(4)); //方法1: //for_each(va.begin(), va.end(), &A::doit); //error //方法2: for_each(va.begin(), va.end(), &A::call_doit); //方法3: for_each(va.begin(), va.end(), mem_fun_ref<void, A>(&A::doit)); system("Pause"); return 0; } 方法1,编译不能通过。for_each只允许具有一个参数的函数指针或函数对象,哪怕A::doit默认有一个this指针参数也不行。不是for_each没考虑到这一点,而是根本做不到! 方法2,显然是受到了beginthread的启发,使用一个静态函数来转调用,哈哈成功了。但是不爽!这不是C++. 方法3,呼,好不容易啊,终于用mem_fun_ref包装成功了成员函数指针。 似乎方法3不错,又是类型安全的,又可以通用——慢着,首先,它很丑,哪有调用普通C函数指针那么漂亮啊(见方法2),用了一大串包装,又是尖括号又是圆括号,还少不了&号!其次,它只能包装不超过一个参数的函数!尽管它在for_each中够用了,但是你要是想用在超过一个参数的场合,那只有一句话:不可能的任务。 是的,在标准C++中,这是不可能的任务。但事情并不总是悲观的,至少有许多第三方库提供了超越mem_fun的包装。如boost::function等等。但是它也有限制:它所支持的参数仍然是有限的,只有十多个,尽管够你用的了;同样,它也是丑陋的,永远不要想它能够简单的用&来搞定。 也许,以失去美丽的代价,来换取质量上的保证,这也是C++对于函数指针的一种无奈吧…… 期待C++0x版本。它通过可变模板参数,能够让mem_fun的参数达到无限个…… ———————— BTW: C++Builder扩展了一个关键字 closure ,允许成员函数指针如同普通函数指针一样使用。也许C++0x能考虑一下…… |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |