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

1510阅读 0评论2014-10-07 coolzsj
分类:C/C++

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
上一篇:Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结
下一篇:c++:类中成员变量是引用