gpt4 book ai didi

C++ 仿函数和零

转载 作者:行者123 更新时间:2023-11-27 22:32:02 26 4
gpt4 key购买 nike

首先是免责声明,我正在替换一堆使用 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>()) {

关于C++ 仿函数和零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1146312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com