gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:49:39 25 4
gpt4 key购买 nike

我有一个接口(interface),我必须传递成员函数指针,该指针静态转换为基指针,并在我们背后存储为空指针和调用类型 ( 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是否是指向那个类的成员函数的指针,你可以在调用(this->* f)(args...).

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

关于c++ - 其他成员函数的通用 'member function' 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com