Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289294
  • 博文数量: 111
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 816
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 20:35
文章分类

全部博文(111)

文章存档

2016年(1)

2015年(5)

2014年(105)

我的朋友

分类: C/C++

2014-10-07 17:40:29

vector 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 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));
    }

转载地址:http://www.cppblog.com/huyi/archive/2006/12/22/16736.html
阅读(1520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~