首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >其他成员函数的通用“成员函数”包装器?

其他成员函数的通用“成员函数”包装器?
EN

Stack Overflow用户
提问于 2019-09-09 09:41:00
回答 1查看 168关注 0票数 3

我有一个接口,其中我必须传递成员函数指针,该成员函数指针是静态转换到一个基本指针的,在我们的背后存储为一个空指针和调用类型(mfc消息表)。

我已经创建了一个包装器,它执行一些异常处理(非常simpel,尝试/捕捉以捕获std::runtime_error),因为这很繁琐,而且在每个用户回调中都容易维护错误。

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

代码语言:javascript
运行
复制
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
        }
      }
};

但是,为了避免每种类型的调用都有明显的过载,是否可以将参数列表参数化?

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

代码语言:javascript
运行
复制
      template<void (MyClass::*f)(Args...)>
      void Dispatch(Args... args) {
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 10:46:39

由于您使用的是C++17,所以可以对模板参数使用auto

代码语言:javascript
运行
复制
template<auto f, typename... Args>
      void Dispatch(Args... args) {
      //...

并通常通过将指向成员函数的指针作为模板参数#1. 实例化来调用它们。

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

还有一点:如果您使用的是rvalue语义,那么接收Args&&和使用std::forward也是个好主意。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57851452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档