提升绑定功能

Gok*_*kul 3 c++ boost bind

我有一个抽象基类A和一组10个派生类.中缀运算符在所有派生类中都被重载

class A{
 public:
    void printNode( std::ostream& os )
    {
           this->printNode_p();
    } 
  protected:
    virtual void printNode_p( std::ostream& os )
    {
           os << (*this);
    }
};
Run Code Online (Sandbox Code Playgroud)

有一个存储基类指针的容器.我想使用boost :: bind函数在每个派生类中调用重载的中缀运算符.我写得像这样

std::vector<A*> m_args
....
std::ostream os;
for_each( m_args.begin(), m_args.end(), bind(&A::printNode, _1, os) );
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题?在visual studio中,我收到这样的错误

错误C2248:'std :: basic_ios <_Elem,_Traits> :: basic_ios':无法访问类'std :: basic_ios <_Elem,_Traits>'中声明的私有成员

谢谢,Gokul.

GMa*_*ckG 5

考虑一下,它按预期工作:

#include <iostream>

struct base
{
    virtual ~base(void) {}

    virtual void print(std::ostream& pStream) = 0;
};

struct foo : base
{
    void print(std::ostream& pStream) { pStream << "foo" << std::endl; }
};

struct bar : base
{
    void print(std::ostream& pStream) { pStream << "bar" << std::endl; }
};

#include <boost/bind.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <algorithm>

int main(void)
{
    boost::ptr_vector<base> v;
    v.push_back(new foo);
    v.push_back(new bar);

    std::for_each(v.begin(), v.end(),
                  boost::bind(&base::print, _1, boost::ref(std::cout)));
}
Run Code Online (Sandbox Code Playgroud)

首先,因为您正在使用boost,所以您也可以使用它ptr_vector来处理内存管理.所以,就在那里.

其次,您的错误是因为流不可复制 ; 但是,boost::bind在构造仿函数时会复制所有它的参数.将其包裹在boost::reference_wrapper(使用boost::ref效用函数)中,这是可复制的.到时候,包装器将转换为必要的类型,你不会注意到差异.

(这是其中一种情况boost::ref.)


这一切都说,考虑使用BOOST_FOREACH,在我看来生成最干净的代码:

#include <boost/foreach.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <algorithm>

#define foreach BOOST_FOREACH

int main(void)
{
    boost::ptr_vector<base> v;
    v.push_back(new foo);
    v.push_back(new bar);

    foreach (base* b, v)
    {
        v->print(std::cout);
    }
}
Run Code Online (Sandbox Code Playgroud)