【问题标题】:Can I make use on templates when implementing different interfaces in the same way?当以相同的方式实现不同的接口时,我可以使用模板吗?
【发布时间】:2022-01-07 02:41:44
【问题描述】:

我有很多接口供不同的监听器使用,它们看起来像这样:

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 做模板,这样我就不用每次都写了?鉴于每个侦听器的虚函数名称都会改变?

【问题讨论】:

  • 您可以拥有一个基础EventTCollector,然后通过仅实现onEventX 为您的每个听众扩展它,但您不能有一个EventTCollector 模板,您可以为不同的听众实例化。如果它主要用于测试目的,那么宏(或宏+模板)可能是最好的方法。
  • 有什么理由他们必须有不同的名字,或者你可以使用onEvent吗?由于重载,一个类仍然可以实现多个监听器。
  • @parktomatomi 我不知道是什么原因,一些团队决定拥有这样的东西,我现在无法更改它们(很遗憾)
  • 涉及命名的时候还有MACRO...
  • @Jarod42 愿他们得到祝福

标签: c++ templates interface virtual-functions


【解决方案1】:

C++ 没有自省功能,所以在ListenerA 中找不到virtual 函数。其他部分可以放在模板化基类中,但您需要手动定义覆盖。

现代 C++ 将使用 std::function&lt;void(EventA)&gt; 代替命名接口,但这对您作为旧接口的用户没有帮助。

【讨论】:

  • 我怀疑,感谢您的确认。我认为,如果至少听众有 virtual operator()(const Event) 而不是虚拟命名函数,我可能已经能够模板化它。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2021-12-05
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多