C++ Functors和Zero

ohn*_*nyj 0 c++ callback boost-bind functor boost-function

首先是免责声明,我正在替换一堆使用boost :: function和boost :: bind的代码.但是,我正在转向不允许rtti的代码库.我想继续使用提升,但不知道是否有办法解决这个限制.

所以,我试图模仿它的一些功能,但更简化.我有一个Callback类:

   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;
};
Run Code Online (Sandbox Code Playgroud)

这允许我使用零参数进行简单的回调:

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();
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将我的回调对象分配为零作为默认参数,如下所示:

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;
};
Run Code Online (Sandbox Code Playgroud)

这可以在使用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;
};
Run Code Online (Sandbox Code Playgroud)

我想这里的提升正在做一些魔术.我知道我可以将参数更改为指针而不是引用,但正如我所说,我正在替换大量代码,并希望最小化从boost更改的影响.

Log*_*ldo 5

提升没有做任何魔术.0只是函数指针构造函数的NULL函数指针.

在你的情况下,我建议你只提供一个默认的构造函数

Callback0() : m_object(NULL), m_method(NULL) {}
Run Code Online (Sandbox Code Playgroud)

并使doSomething看起来像

void doSomething(const Callback0<Wtf, void>& callback = Callback0<Wtf, void>()) {
Run Code Online (Sandbox Code Playgroud)

  • 如果你认为他的答案是正确的,你应该把它标记为正确,这样他就能得到代表. (2认同)