【发布时间】:2013-04-13 04:55:01
【问题描述】:
我有一个类Foo,它提供了某种功能。为了保持模块化,Foo 是一个接口(即只有抽象方法的 C++ 类),而 Foo 的实现可以选择具体如何实现功能。但是,我的界面包含一个模板方法。也就是说,
class Foo
{
public:
template<class T>
void functionality(const T&);
};
C++ 中不可能有模板方法virtual。是否有任何技术可以使用模板方法实现类似的结果(模块化和多态性)?
【问题讨论】:
-
您是否有一组有限的、预先确定的类型需要使用它?
T是否有任何属性,例如“必须是类整数类型”或“必须是类函子类型”或“必须是类数字类型”,您可以提供给我们吗?您是否需要通过特征类或类似支持的“第 3 方”扩展? 究竟,functionality做了什么?在这种情况下,性能到底有多重要? (而不仅仅是“我喜欢快速的东西”:即“这个函数必须在 60 hz 的 7 Mpx 图像上每个像素运行一次”)。算法是否基本忽略了T作为载体的价值? -
Foo 实现了来自 N 个不同进程的
send和recv消息。我最初的实现是为每种消息类型使用一个消息队列,T 是可以作为消息发送的类(所有这些类都扩展了一个抽象类Message)。send和recv这样的方法是模板的原因是,队列管理可以在编译时自动设置,并在运行时注册一些消息类型。我的愿望是,如果将来出于某种原因希望通过互联网而不是 IPC 进行通信。 -
想象一个客户发明了一种新的类型
Bob,它派生自Message。多年前编译的服务器不会知道Bob。所以它不能创建一个队列——它不能为将来创建的每种可能的类型创建一个队列,因为它们的数量是无限的!现在,如果您以某种方式唯一地命名这些类中的每一个,您就可以做到这一点,并且服务器中除了Message接口之外没有任何东西关心Message的细节,但是现在不需要模板接口就可以了?
标签: c++ templates inheritance interface polymorphism