以相同的方式实现不同的接口时,我可以在模板上使用吗?

Can I make use on templates when implementing different interfaces in the same way?

我有很多针对不同监听器的接口,它们都是这样的:

class ListenerA
{
public:
    virtual void
    onEventA(const EventA&) = 0;
};

class ListenerB
{
public:
    virtual void 
    onEventB(const EventB&) = 0;
};

测试时,我总是最终将这些事件收集到 std::vector 中,以便之后在特定测试套件中对其进行分析。这些事件收集器看起来都和这个一样,例如:

class EventACollector : public ListenerA
{
public:

    const auto&
    events() const
    {
        return m_events;
    }

private:

    void
    onEventA(const EventA& event) override
    {
        m_events.emplace_back(event);
    }

    std::vector<EventA> m_events;
};

有没有办法模板化一个EventTCollector,这样我就不用每次都写了?假设每个侦听器的虚函数名称都会改变?

C++没有内省,所以你在ListenerA中找不到virtual函数。其他部分可以进入模板化基础 class,但您需要手动定义覆盖。

现代 C++ 将使用 std::function<void(EventA)> 而不是命名接口,但这对您作为旧接口的用户没有帮助。