我有一个接口,其中我必须传递成员函数指针,该成员函数指针是静态转换到一个基本指针的,在我们的背后存储为一个空指针和调用类型(mfc,消息表)。
我已经创建了一个包装器,它执行一些异常处理(非常simpel,尝试/捕捉以捕获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) {
发布于 2019-09-09 10:46:39
由于您使用的是C++17,所以可以对模板参数使用auto
:
template<auto f, typename... Args>
void Dispatch(Args... args) {
//...
并通常通过将指向成员函数的指针作为模板参数#1. 实例化来调用它们。
如果需要检查f
是否是指向该类成员函数的指针,则可以在调用(this->*f)(args...)
之前使用一些static_assert
语句。
还有一点:如果您使用的是rvalue语义,那么接收Args&&
和使用std::forward
也是个好主意。
https://stackoverflow.com/questions/57851452
复制相似问题