为何auto变体函数无法替代等价模板版本实现事件分发?
C++事件分发模板与auto变体问题及优化建议
问题背景
我正在开发一个C++项目,需要将事件分发至不同模块。现有基类Event及多个派生事件类型(EventA、EventB、EventC),模块继承自模板类Module,该基类通过concept与SFINAE机制,将事件分发至派生类中已定义的处理函数。
模板版本的实现可正常工作,但仅使用auto关键字的变体却无法生效。
可正常运行的完整代码
struct Event {}; struct EventA : Event {}; struct EventB : Event {}; struct EventC : Event {}; class MyModule; template <typename T> concept IsEventType = std::is_base_of_v<Event, T>; template <typename Dispatcher, typename Dispatchable> concept CanDispatch = requires(Dispatcher* d, const Dispatchable& e) { { d->dispatch(e) }; }; template <typename Derived> class Module { public: void onEvent(const IsEventType auto& e) { dispatchEvent(e, static_cast<Derived*>(this)); } private: // 正常工作的模板版本 template<IsEventType Dispatchable, CanDispatch<Dispatchable> Dispatcher> void dispatchEvent(const Dispatchable& e, Dispatcher* dispatcher) { dispatcher->dispatch(e); } void dispatchEvent(...) {} }; class MyModule : public Module<MyModule> { public: void dispatch(const EventA& event) { std::cout << "Handling EventA in MyModule" << std::endl; } void dispatch(const EventB& event) { std::cout << "Handling EventB in MyModule" << std::endl; } }; int main() { MyModule m; m.onEvent(EventA{}); m.onEvent(EventB{}); m.onEvent(EventC{}); }
无法生效的auto变体代码
我尝试用以下代码替代模板版本,但该函数从未被调用:
// 也试过 CanDispatch<std::remove_cvref_t<decltype(e)>> void dispatchEvent(const IsEventType auto& e, CanDispatch<decltype(e)> auto* dispatcher) { dispatcher->dispatch(e); }
附加问题
- 若有更简洁清晰的实现方案,欢迎推荐;
- 是否有办法避免在基类函数前声明派生类函数?
内容的提问来源于stack exchange,提问作者Bruno Perković
相关产品推荐
相关产品推荐

