c – 如何在派生类中调用模板化方法,在基类中实现纯虚方法?

c – 如何在派生类中调用模板化方法,在基类中实现纯虚方法?,第1张

概述我有一个带有几个纯虚方法的基类,例如 class GenericFunction {public: GenericFunction() { /* Init generic function state */ }; virtual void Iterate(short *ps, unsigned cs) = 0; virtual void Iterate(float *ps, uns 我有一个带有几个纯虚方法的基类,例如

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<>,它也只有一个实例.

总结

以上是内存溢出为你收集整理的c – 如何在派生类中调用模板化方法,在基类中实现纯虚方法?全部内容,希望文章能够帮你解决c – 如何在派生类中调用模板化方法,在基类中实现纯虚方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存