C++:条件继承是可能的

Xun*_*ang 7 c++ inheritance arduino

我正在研究微处理器(Arduino)项目.我的库Foo继承自现有的库Basic.后来我将其功能扩展Basic到了另一个类Advanced.然而,Advanced更难以延伸硬件,使已经制作的一个演示无法使用.

我在想的是如下:

class Foo:
#ifndef USE_BASIC
public Advanced
#else
public Basic
#endif
{
...
}
Run Code Online (Sandbox Code Playgroud)

#define USE_BASIC输入我的演示代码:

#define USE_BASIC
#include <Foo.h>
Run Code Online (Sandbox Code Playgroud)

但是,Foo不是继承自Basic.我在这做错了吗?或者,如果有其他方法可以解决这个问题?

Naw*_*waz 18

更简洁的解决方案是使用模板:让编译器根据模板参数选择基类.

这是一个例子:

 #include <type_traits> //for std::conditional


 //here you go with your own class
 template<bool UseAdvanced>
 class Foo : public std::conditional<UseAdvanced, Advanced, Basic>::type
 {
      //your code
 };
Run Code Online (Sandbox Code Playgroud)

以下是您将如何使用此类:

Foo<true>   fooWithAdvanced; //it uses Advanced as base class
Foo<false>  fooWithBasic;    //it uses Basic as base class!
Run Code Online (Sandbox Code Playgroud)

那是一种方法.但有更好的方法.特别是,我将按以下方式设计类模板,其中模板参数将充当类.这将是更灵活的设计.

 template<typename Base>
 class Foo : public Base
 {
      //your code
 };
Run Code Online (Sandbox Code Playgroud)

所以,你可以使用Basic,Advanced任何其他类作为基类,只要它支持所要求的功能Foo和它的用法:

 Foo<Advanced>  fooWithAdvanced;
 Foo<Basic>     fooWithBasic;
 Foo<OtherBase> fooWithOtherBase;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 谢谢!了解这些方法很好,但可能不适合我的情况,不确定将模板添加到微处理器中是否会更好或更坏... (2认同)
  • 模板不是 Arduino 编译器的默认语言功能,所以我需要引入另一个第 3 部分库来使用模板,这将占用更多已经达到极限的存储空间......不过可能值得一试,因为下一个项目:) (2认同)