我想知道是否可以继承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?
答案 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>