【发布时间】: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