是否有可能从boost :: function继承?

时间:2011-03-10 03:06:33

标签: c++ inheritance boost

我想知道是否可以继承boost :: function。

基本上,为了便于使用,我想要的是什么 有一个类型“委托”,它基本上是一个boost :: function。  它只是为了易于使用我正在写的一些代码。

我一度将typedef的boost :: function转移到Delegate,但在我的经验中,typedef'ing与gdb的东西一起玩。特别是如果它是模板化的,那么我想避免这种情况(尝试调试那些已经过类型化的stl容器?oofta)。

我在网上发现了一些代码的例子:

template<class Signature>
class Delegate : public boost::function<Signature>
{
public: 
    using boost::function<Signature>::operator();
};

现在,当我尝试使用它时,我遇到了一些错误。 一个用法示例是:

Tank * tankptr = new Tank();
Delegate<void ()> tankShoot(boost::bind(boost::mem_fn(&Tank::Shoot),tankptr));

这会产生错误,例如

error: no matching function for call to ‘Delegate<void ()()>::Delegate(boost::_bi::bind_t<boost::_bi::unspecified, boost::_mfi::mf0<void, Tank>, boost::_bi::list1<boost::_bi::value<Tank*> > >)’
Delegate.h:26: note: candidates are: Delegate<void ()()>::Delegate()
Delegate.h:26: note:                 Delegate<void ()()>::Delegate(const Delegate<void()()>&)

如果我不得不猜到为什么我会收到这些错误,我不得不说这是因为我错过了 某种复制构造函数,它接受boost :: bind构造函数返回的任何基础。

关于我如何克服这个障碍的任何想法,或任何能够指出我好榜样的人 继承自boost :: function?

2 个答案:

答案 0 :(得分:6)

从类派生不会自动“继承”派生类的基类构造函数。您需要在那里创建所有必需的构造函数。

答案 1 :(得分:0)

hKaiser在我需要编写所需的构造函数时是正确的。

我有一段时间了,直到我找到了升级类的接口文件“function” 在他们的网站上。

最后,我得到了类似的结果:

template<class Signature>
class Delegate : public boost::function<Signature>
{
public:
  ///use the functor operator from the original class
  using boost::function<Signature>::operator();

  ///base constructor for our new type, 
  Delegate() : boost::function<Signature>() {/*empty*/}

  ///copy constructor for our new type
  Delegate(const boost::function<Signature>& x) : boost::function<Signature>(x) {/*empty*/}

  Delegate& operator=(const Delegate & _delegate)
  {
    boost::function<Signature> x = _delegate;
    try
    {
      dynamic_cast<boost::function<Signature> & >(*this) = x;
    }
    catch(bad_cast &bc)
    {
      cout << "Bad Cast Exception. " << bc.what();
      int * ptr = NULL;
      *ptr = 1; //force seg fault instead of assert
    }
    return *this;
  }
};

我不确定我是否正确使用dynamic_cast(在遵守良好的编码实践的情况下),或者我甚至在赋值运算符中需要它,但它确实有效,并且工作得非常好。< / p>

相关问题