【问题标题】:Boost bind function增强绑定功能
【发布时间】:2023-03-31 08:25:01
【问题描述】:

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

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

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

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

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

错误 C2248: 'std::basic_ios<_elem>::basic_ios' : 无法访问私有成员 在课堂上声明 'std::basic_ios<_elem>'

谢谢, 悟空。

【问题讨论】:

  • 您遇到了什么问题?是没有编译,还是没有做你想做的事?
  • @Alex:我已经更新了错误的帖子

标签: c++ boost bind


【解决方案1】:

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

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

首先,由于您使用的是 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);
    }
}

【讨论】:

    【解决方案2】:

    问题在于 std::ostream 不可复制。我是这样修复的

    for_each( m_args.begin(), m_args.end(), bind(&A::printNode, _1, boost::ref(os) ) );
    

    谢谢, 悟空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2011-10-25
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多