You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:29:58