我自闲庭信步,悠然自得,不亦乐乎.

                                       ------ Keep life simple
GMail/GTalk/MSN:huyi.zg@gmail.com

 

将成员函数作为std::for_each的第三个参数

vector<Book> books;
void CBookEditDlg::ForEachBookFunctor(Book book)
{
    ......
}
for_each(books.begin(), books.end(), std::bind1st(mem_fun(&CBookEditDlg::ForEachBookFunctor), this));

关键点在于mem_fun和bind1st的使用。

for_each的实现中最核心的一个调用:functor(*iterater);
由于类非静态成员函数,必须在实例上调用:(instance->*pfn)(params);
所以for_each无法直接使用传过去的函数地址,函数指针的第一个参数是类的一个实例指针(this指针),所以必须想办法把这个指针传过去(使用std::bind1st)

关于mem_fun的一些资料,请参考
http://www.stlchina.org/documents/EffectiveSTL/files/item_41.html

对于带两个以上参数的成员函数,用stl是不能达到目的的,因为mem_fun只能生成不带参数,或者是仅带一个参数的函数对象(functor),bind1st和bind2st也只能对第一个或者是第二个参数进行绑定。
要实现对任意数量参数的成员函数生成functor,必须对stl进行扩展,所幸boost已经做到了这点,boost::bind和boost::mem_fn就是更加泛化的std::bind1st和std::mem_func

    void ForEachClassFunctor(Class c, CTreeItem treeItem)
    {
        treeView.InsertItem(c.name.c_str(), treeItem, NULL);
    }

    void ForEachBookFunctor(Book book)
    {
        CTreeItem treeItem = treeView.InsertItem(book.name.c_str(), NULL, NULL);
        vector<Class> v;
        v.push_back(Class(0,0,"nameClass1", "titleClass1"));
        for_each(v.begin(), v.end(),
            boost::bind(boost::mem_fn(&CBookEditDlg::ForEachClassFunctor), this, _1, treeItem));
    }

posted on 2006-12-22 15:10 HuYi 阅读(5151) 评论(3)  编辑 收藏 引用 所属分类: C/C++代码Windows

评论

# re: 将成员函数作为std::for_each的第三个参数 2006-12-23 23:30 李锦俊

不知道用Loki的Functor是否更好?  回复  更多评论   

# re: 将成员函数作为std::for_each的第三个参数 2008-09-14 13:59 徐忠义

直接定义为全局函数就可以了  回复  更多评论   

# re: 将成员函数作为std::for_each的第三个参数 2013-04-24 17:30 chenhong

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶顶 顶顶顶  顶顶顶顶顶
顶顶顶顶顶顶    顶顶顶顶顶顶顶 顶顶顶顶 顶顶顶顶顶
顶顶顶顶顶   顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶
顶顶顶顶  顶顶顶顶顶顶顶顶顶顶顶顶 顶   顶顶 顶顶
顶顶  顶 顶顶顶顶顶顶顶顶顶顶  顶顶顶 顶顶   顶
顶顶顶顶顶 顶顶顶顶顶顶顶顶顶   顶顶顶   顶顶顶顶
顶顶顶顶   顶顶顶顶顶顶顶顶顶顶 顶  顶 顶顶顶顶顶
顶顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶  顶  顶   顶顶
顶顶   顶  顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶
顶 顶顶   顶顶顶顶顶顶顶顶   顶   顶 顶顶顶顶
顶顶顶顶顶  顶顶顶顶顶顶顶顶 顶  顶顶 顶 顶顶顶顶
顶顶顶顶    顶顶顶顶顶顶 顶顶 顶顶顶顶顶 顶顶顶顶
顶顶顶  顶顶   顶顶顶顶 顶  顶顶 顶顶 顶顶顶顶
顶   顶顶顶顶    顶顶顶顶顶 顶顶顶   顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
http://www.szhrz8.com  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(12)

随笔分类

相册

收藏夹

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜