以相同的方式实现不同的接口时,我可以在模板上使用吗?
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)>
而不是命名接口,但这对您作为旧接口的用户没有帮助。
我有很多针对不同监听器的接口,它们都是这样的:
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)>
而不是命名接口,但这对您作为旧接口的用户没有帮助。