我有一个这样的界面(除了在真正的库代码中比这更长)
struct IFoo
{
virtual void onA(A& a) = 0;
virtual void onB(A& a) = 0;
virtual void onC(A& a) = 0;
};
我常常实现IFoo
的不同监听器。因此,我设计了一个像这样的辅助类:
template <class T>
struct IFooHelper {
virtual void onA(A& a) { static_cast<T*>(this)->onGeneric(a); }
virtual void onB(B& b) { static_cast<T*>(this)->onGeneric(b); }
virtual void onC(C& c) { static_cast<T*>(this)->onGeneric(c); }
};
所以现在,当我在监听器中有很多常见行为时,我不必提供每个IFoo
函数的虚拟覆盖,我可以这样做:
struct Fox : public IFooHelper<Fox>
{
template <class T> void onGeneric(T& t) { //do something general }
void onD(D& d) { //special behavior only for a type D }
};
这已经非常好用,但现在我正在实现一个我想要一些常见行为的监听器,然后更新一个计数器,比如说它是哪种类型的调用。换句话说,假设我只有上面的类型A,B,C
,我的听众将是:
struct Ugly : public IFooHelper<Ugly>
{
void onA(A& a) { //8 lines of common code; //update some counter for type A objs; }
void onB(B& b) { //8 lines of common code; //update some counter for type B objs; }
void onC(C& c) { //8 lines of common code; //update some counter for type C objs; }
};
在这里,调用必须非常快(所以没有查找),理想情况下我可以利用IFooHelper
将常见行为提升到模板方法中,然后以某种方式仍然可以区分类型。我正在考虑类似于模板专用结构的东西,其中偏移到静态cons char * array..or,其值本身是char *,取决于T
..有更好的方法吗?
答案 0 :(得分:1)
不确定我是否完全明白你在寻找什么,但我会试一试。作为第一步,请考虑以下事项:
struct NotSoUgly : public IFooHelper<NotSoUgly>
{
void updateCounter(A& a) { //update some counter for type A objs; }
void updateCounter(B& b) { //update some counter for type B objs; }
void updateCounter(C& c) { //update some counter for type C objs; }
template <class T> void onGeneric(T& t) {
//8 lines of common code;
updateCounter(t);
}
};
如果您向我们展示了updateCounter()
方法的内容,我们可以为其提供单一的通用实现,但是如果没有看到代码,那么可以进一步改进,它是&#39;很难猜到。