4

我有一个这样的界面(除了在真正的库代码中比这长得多)

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..有更好的方法吗?

4

1 回答 1

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()方法的内容,我们也可以为此提出一个通用实现,但如果没有看到代码,就很难猜出进一步的改进。

于 2013-02-17T11:05:46.860 回答