其他成员函数的通用"成员函数"包装器?
Generic 'member function' wrapper for other member function(s)?
我有一个接口,我必须在其中传递成员函数指针,这些指针被静态转换为基本指针,并在我们背后存储为空指针和调用类型(mfc 消息表(。
我创建了一个包装器来执行一些异常处理(非常简单的尝试/捕获以捕获 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 来正常调用它们。活生生的例子。
如果需要检查f
是否是指向该类的成员函数的指针,可以在调用(this->*f)(args...)
之前使用一些static_assert
语句。
还有一件小事:如果您使用的是右值语义,那么接收Args&&
并使用std::forward
也是一个好主意。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针