c – 如何在派生类中调用模板化方法,在基类中实现纯虚方法?
发布时间:2020-12-16 07:05:19 所属栏目:百科 来源:网络整理
导读:我有一个带有几个纯虚方法的基类,例如 class GenericFunction {public: GenericFunction() { /* Init generic function state */ }; virtual void Iterate(short *ps,unsigned cs) = 0; virtual void Iterate(float *ps,unsigned cs) = 0;} 然后我有一堆实现
我有一个带有几个纯虚方法的基类,例如
class GenericFunction { public: GenericFunction() { /* Init generic function state */ }; virtual void Iterate(short *ps,unsigned cs) = 0; virtual void Iterate(float *ps,unsigned cs) = 0; } 然后我有一堆实现特定函数的派生类,我想在这些函数的集合上调用Iterate()方法,为每个函数提供一个数据样本块.我只知道我正在调用Iterate()时的数据类型. 对于许多函数,Iterate()方法几乎完全相同,所以我想使用模板.我不能在基类中使用模板,因为不允许使用虚拟模板.为了让编译器从模板生成正确的方法,我发现我必须使用对模板的间接调用,如下所示: class SpecificFunction : GenericFunction { public: SpecificFunction() : GenericFunction() { /* Init specific function state */ }; template<class T> void IterateT(T *ps,unsigned cs) { // Do function operations on block of samples }; virtual void Iterate(short *ps,unsigned cs) { IterateT(ps,cs); }; virtual void Iterate(float *ps,cs); }; } 我不想让SpecificFunction的整个类成为模板,因为还有许多其他方法,并且所有代码都与正在操作的样本类型无关.我不希望在从模板生成代码时复制所有代码,因为它是在嵌入式处理器上进行的,并且代码空间有限. 这似乎是错综复杂和低效的.有一个更好的方法吗? 解决方法
这是一个可怕的钻石(虚拟继承和多重继承)可以帮助你的情况.您可以使用几乎从GenericFunction继承的模板代理类作为常用实现.然后,对要创建特定功能的特定实现使用多重继承.
class ProxyState; template <typename T> class ProxyFunction : public virtual GenericFunction { public: ProxyFunction() : GenericFunction() {}; virtual ProxyState * state () { return 0; } void Iterate (T *ps,unsigned cs) { // Do function operations on block of samples,using state() // if necessary std::cout << __PRETTY_FUNCTION__ << "n"; } }; class SpecificFunction : public ProxyFunction<short>,public ProxyFunction<float> { public: SpecificFunction() : ProxyFunction<short>(),ProxyFunction<float>() { /* Init specific function state */ }; }; //... SpecificFunction s; GenericFunction *g = &s; g->Iterate((short *)0,0); g->Iterate((float *)0,0); 上面的程序给了我以下输出: void ProxyFunction<T>::Iterate(T*,unsigned int) [with T = short int] void ProxyFunction<T>::Iterate(T*,unsigned int) [with T = float] 图示,该图表如下: GenericFunction | /_ (virtual) | ProxyFunction<T> | ____________|____________ | | ProxyFunction<short> ProxyFunction<float> | | /_ /_ |_______ _______| | | SpecificFunction 因为GenericFunction是虚拟继承的,所以即使ObjectFunction继承了多个ProxyFunction<>,它也只有一个实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |