[英]C++ Functors and Zero
首先是免责声明,我要替换一堆使用boost :: function和boost :: bind的代码。 但是,我将移至不允许rtti的代码库。 我想继续使用boost,但不知道是否有解决此限制的方法。
因此,我试图模仿它的某些功能,但要简化得多。 我有一个回调类:
template <class Class, typename ReturnType = void> class Callback0 {
typedef ReturnType (Class::*Method)();
public:
Callback0(Class* object, Method method)
: m_object(object)
, m_method(method)
{
;
}
Callback0(const Callback0& callback)
: m_object(callback.m_object)
, m_method(callback.m_method)
{
;
}
operator bool() {
return m_object != 0;
}
operator bool() const {
return m_object != 0;
}
ReturnType operator()() {
return (m_object->*m_method)();
}
Callback0<Class, ReturnType>& operator=(const Callback0<Class, ReturnType>& callback) {
if(this != &callback) {
m_object = callback.m_object;
m_method = callback.m_method;
}
return *this;
}
private:
Class* m_object;
Method m_method;
};
这使我可以使用零参数进行简单的回调:
class Meh {
public:
Meh() {;}
~Meh() {;}
void f0() {
footprint6v("%s\n", __FUNCTION__);
}
};
static void meh() {
Meh* m = new Meh;
Callback0<Meh, void> c0(m, &Meh::f0);
c0();
}
我希望能够将回调对象分配为零作为默认参数,如下所示:
class Wtf {
public:
Wtf() : m_callback(0) {;}
~Wtf() {;}
void doSomething(const Callback0<Wtf, void>& callback = 0) {
m_callback = callback;
}
private:
Callback0<Wtf, void> m_callback;
};
当您使用boost :: function时,这可以工作:
class Wtf {
public:
Wtf() : m_callback(0) {;}
~Wtf() {;}
void doSomething(const boost::function<void()>& callback = 0) {
m_callback = callback;
}
private:
boost::function<void()> m_callback;
};
我想boost在这里做一些魔术。 我知道我只能将参数更改为指针而不是引用,但是正如我所说的,我正在替换很多代码,并希望最小化从boost更改的影响。
Boost并没有做任何魔术。 0只是函数指针构造函数的NULL函数指针。
我建议您为您提供一个默认的构造函数
Callback0() : m_object(NULL), m_method(NULL) {}
并使doSomething看起来像
void doSomething(const Callback0<Wtf, void>& callback = Callback0<Wtf, void>()) {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.