我有一个这样的界面(除了在真正的库代码中比这长得多)
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* 数组的偏移量..或本身的值是 char* 取决于T
..有更好的方法吗?