由于基于接口的编程,遇到 C++ 虚拟模板函数问题
Running into c++ virtual template function issue due to interface based programming
我们正在设计一个新系统,我们已经为大多数类创建了接口,以便我们可以为它们创建模拟(谷歌模拟)进行单元测试。结果,所有功能都是虚拟的,但问题是我经常因此遇到模板虚拟功能问题。我已经看到了一些关于如何进行多调度的示例,但它们似乎都使用了模板的一些变体,这似乎并不简单。那么这是否意味着我的整个代码库现在最终将带有模板,使其难以阅读/使用和调试?
还是我没有设计好的界面。下面是一个简单的示例,我正在为消息队列编写接口。
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);
};
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数