代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver

重新解释成员函数指针是“好主意”吗?

  •  2
  • Chris Huang-Leaver  · 技术社区  · 15 年前

    template <class T> class ThreadAction
    {
    public:
    
      typedef void (T::*action)();
    
      ThreadAction(T* t, action f) :
        func(f),obj(t) {}
      void operator()() { (obj->*func)(); }
    
      void (T::*func)();
      T* obj;
    
    };
    

    通常是这样称呼的

    myActionThread->addAction(
        new ThreadAction<TheirClass>(this, &TheirClass::enable)
    );
    

    在那之前,它一直运作良好

     void TheirClass::enable()
    

    改为

     bool TheirClass::enable()
    

    遗憾的是,我们无法再次更改它,因为其他内容需要新的格式(并且重载不能仅因返回类型而有所不同)。

    我确实试过了

    myActionThread->addAction( 
        new ThreadAction<TheirClass>(this, 
            reinterpret_cast<void(TheirClass::*)>(&TheirClass::enable)
        )
    );
    

    这看起来很好,但我不确定像这样重新解释函数指针是否是“定义的”行为,有人能提供建议吗?

    4 回复  |  直到 15 年前
        1
  •  9
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    这绝对是

    基本上,你需要做一个包装 TheirClass::enable() 将具有正确的返回类型。一个简单的一行就足够了:

    public:
        void enableWrapper() { enable(); };
    

    然后打电话:

    myActionThread->addAction(
        new ThreadAction<TheirClass>(this, &TheirClass::enableWrapper)
    );
    

    如果您不能修改 TheirClass 然后直接创建一个实现包装器的简单子类或帮助器类。

        2
  •  2
  •   NewbiZ    15 年前

    bool void ?

    这可能很危险,具体取决于使用的呼叫/返回约定。你 可以 忘记弹出返回值-或用返回值覆盖寄存器的值。

        3
  •  2
  •   David Joyner    15 年前

    template <class T, typename RetType> class ThreadAction
    {
    public:
     typedef RetType (T::*action)();
     ThreadAction(T* t, action f) :
       func(f),obj(t) {}
    
     RetType operator()() { return (obj->*func)(); }
     RetType (T::*func)();
     T* obj;
    };
    

    这是一个应用程序 return void

        4
  •  1
  •   Brian Postow    15 年前

    如果没有上下文,这可能是正确的。