由于基于接口的编程,遇到 C++ 虚拟模板函数问题

Running into c++ virtual template function issue due to interface based programming

本文关键字:虚拟 函数 问题 C++ 遇到 接口 于基于 编程      更新时间:2023-10-16

我们正在设计一个新系统,我们已经为大多数类创建了接口,以便我们可以为它们创建模拟(谷歌模拟)进行单元测试。结果,所有功能都是虚拟的,但问题是我经常因此遇到模板虚拟功能问题。我已经看到了一些关于如何进行多调度的示例,但它们似乎都使用了模板的一些变体,这似乎并不简单。那么这是否意味着我的整个代码库现在最终将带有模板,使其难以阅读/使用和调试?

还是我没有设计好的界面。下面是一个简单的示例,我正在为消息队列编写接口。

Class IMessageQueue {
   Public:
    Virtual int send(const T & value);  // I can't do this but this is exactly what I want to do, as send should be able to send any type 
};
Class MessageQueue : public IMessageQueue {
      Public:
       Virtual int send(const T & value) { ... }
};
Class MockMQ : public IMessageQueue {
      Public: 
         Virtual int send(const T & value) {
               // mock implementation
          }
};

如何解决此问题?这只是一个例子,但由于基于接口的编程,我遇到了很多这类问题。

这取决于您是否需要 IMessageQueue 来调度特定的未知类型或任何类型。那不是一回事。

特定的未知类型可以由

template<typename T>
class IMessageQueue {
public:
  virtual int send(const T& value);
}

这样你就可以拥有你的IMessageQueue<MyMessage>IMessageQueue<OtherMessage>.

相反,如果您需要能够发送具有相同类型消息队列的任何类型的消息队列,那么您可以选择声明所有消息通用的特定接口,如

class Message
{
protected:
  Message() : { .. }
};
class MyMessage : public Message
{
..
};
class MessageQueue
{
public:
  void send(const Message& message);
};