其他成员函数的通用 'member function' 包装器?

Generic 'member function' wrapper for other member function(s)?

我有一个接口,我必须传递成员函数指针,该指针被静态转换为基指针,并在我们的背后存储为空指针和调用类型( message tables).

我已经创建了一个包装器来执行一些异常处理(非常简单 try/catch 来捕获 std::runtime_error)因为这很乏味并且在每个用户回调中都容易维护。

到目前为止,下面的包装器实际上运行得相当好(想法是直接获取成员函数指针作为值模板参数 - 本质上是给一个成员函数每个回调函数的包装器。):

class MyClass : public CWnd/*example*/{
public:
      template<void (MyClass::*f)(CCmdUI*)>
      void Dispatch(CCmdUI* pCmdUI) {
        try {
          (this->*f)(pCmdUI);
        }
        catch (std::runtime_error& e) {
          //handle error
        }
      }
};

但是为了避免对每种类型的调用进行显式重载 - 是否可以参数化参数列表?

插图(注意这不起作用):

      template<void (MyClass::*f)(Args...)>
      void Dispatch(Args... args) {

由于您使用的是 C++17,因此您可以在模板参数上使用 auto

template<auto f, typename... Args>
      void Dispatch(Args... args) {
      //...

并通过将指针作为模板参数 #1 传递给成员函数来正常调用它们。 Live Example.

如果你需要检查f是否是指向那个class的成员函数的指针,你可以在调用(this->*f)(args...)之前使用一些static_assert语句。

还有一件小事:如果您使用右值语义,接收 Args&& 并使用 std::forward.

也是一个好主意