c – 如何避免使用静态多态复制代码
发布时间:2020-12-16 07:03:27 所属栏目:百科 来源:网络整理
导读:我有一个像这样的接口(除了在真正的库代码中比这长得多) struct IFoo{ virtual void onA(A a) = 0; virtual void onB(A a) = 0; virtual void onC(A a) = 0;}; 我常常实现IFoo的不同监听器.因此,我设计了一个像这样的辅助类: template class Tstruct IFooHe
我有一个像这样的接口(除了在真正的库代码中比这长得多)
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 ..有更好的方法吗? 解决方法
不确定我是否完全明白你在寻找什么,但我会试一试.作为第一步,请考虑以下事项:
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()方法的内容,我们可以为它提供单个通用实现,但是如果没有看到代码,则很难猜测. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |