假设我有一个我想使用的第三方C ++库。它充满了Component基类的子类。 Component base具有针对无数事件的虚拟处理程序,例如onEvent()。
我想为此提供一个实现,这是一个将处理程序定义为std :: function<>的接口。 lambdas(所以我可以动态定义实现)。当然,生成的混合子类仍然可以用作其基类。
我天真的解决方案是创建一个mixin适配器模板,提供动态实现。这是我正在谈论的样本。有没有更好的方法,或者我可以遵循的更标准的习惯用法?
#include <stdio.h>
#include <functional>
// Third-party SDK
// Base class
class Component
{
public:
virtual void onEvent(int val)
{
}
};
// Component subclass
class FooComponent : public Component
{
};
// My overlay interface to set an event handler
class IAdapter
{
public:
virtual void setOnEventHandler(const std::function<void(int)>& handler) = 0;
};
// Mixin implementor -- only one is given, but there could be one for each type of handler
template <typename Base>
class AdapterImpl1 : public IAdapter, public Base
{
public:
virtual void setOnEventHandler(const std::function<void(int)>& handler) override
{
m_onEventHandler = handler;
}
virtual void onEvent(int val) override
{
if (m_onEventHandler)
{
m_onEventHandler(val);
}
}
private:
std::function<void(int)> m_onEventHandler;
};
// Final implementation. If there were more mixins, there could be for example,
class MyFooComponent : public AdapterImpl1<FooComponent>
{
};
// Main
int main()
{
MyFooComponent a;
a.setOnEventHandler([](int val){
printf("Handler val: %d\n", val);
});
// ...
a.onEvent(3);
return 0;
}