如何使 C++ class 在编译时仅继承两个基 class 中的一个?

How to make a C++ class that inherits from only one of two base classes at compile time?

第一次post。这是关于如何在 C++ 中做某事的一般性问题。为了不浪费您的时间,我只问一般情况。但是,如果您的回答类似于 "Why do you want to do something so stupid like that?",我将在下面提供详细信息。

一般问题

我有一个带有公共代码 (SPIBase) 的基础 class。我有两个继承它的 classes,它们具有截然不同的实现(SPIMaster、SPISlave)。在这两个 class 中的每一个中,我都公开了相同的 public/protected 功能。我想写一个 class, 可选地 继承自这两个 class 之一。我应该怎么做?

详情

我正在为一些微电子 (ESP8266) 构建一个库。我使用 Arduino IDE,库是 C++ 的。您可能很熟悉,SPI 是一个 methodology/protocol,用于在两个微控制器或一个微控制器与传感器之类的东西之间进行通信。一个微控制器始终是主机,另一个 device/sensor 始终是从机。 Master完全控制SPI中的通信过程。从站通常是相对被动的。我已经编写了仅在两个 ESP8266 微控制器之间工作的库,以形成一个 TCP/IP 类协议,其中任何一个都可以向另一个未经请求的人发送消息。基本上,Master/Slave 问题是隐藏的,使用该库的开发人员可以按照他们喜欢的任何方式在任一方向设置他们的协议。 (即 Client/Server/Peer 消息、send/response、流等)。虽然,Master/Slave 问题是隐藏的,但显然,一个 ESP8266 必须使用一种基本实现,而另一个 ESP8266 必须使用另一种。

我现在想编写实现流/文件传输的层。这个 class 将骑在两个中间 class 中的一个或另一个上,但除了它们继承的 class 之外将是相同的。他们都将既是发送者又是接收者。我宁愿没有两个在实现上完全相同的完整 classes。在这种情况下,我真的不希望一个代码链的任何部分位于另一台设备上。经过研究证明我最初的想法是不可能的基本上是......让使用开发人员的库在他们的主程序文件中使用#define MASTER或#define SLAVE并且流class将继承一个或另一个classes 基于此。我很快发现#defines 在下游是不可见的。 是否有一些 C++ 设计方法/模式可以获得我想要的结果? 谢谢你的时间。

您可以使用模板。例如:

template <typename SPIImpl>
class SPIStream : public SPIImpl
{
    // stream implementation using the common interface
};

然后您可以像这样声明 class 的实例:

SPIStream<SPIMaster> spi_master_stream;

SPIStream<SPISlave> spi_slave_stream;