我定义了一个类(class)

template <class T> class NodeMap {

NodeMap(int n, T defaultEntry = NULL);

virtual ~NodeMap();

T& operator[](const node& u);

...

}

它将node类型的对象映射到参数类型T的对象。

现在,我想拥有一个Matching类,它实际上是一个NodeMap<node>。为了方便起见,我想添加isProperMatching(Graph& G)match(node u, node v)之类的方法。 Matching可以从NodeMap<node>继承吗?是否可以使用固定的模板参数扩展模板类(如果可以,是个好主意)吗?

最佳答案

到目前为止,您所显示的代码告诉我您在做什么,您可能会遇到以下情况:

  • Nodemap专用于T=node,以包括您想要的其他方法。为了方便起见,您可以将def Nodemap<node>键入Matching。但是,这可能会添加一些与非专业模板中的方法重复的代码。
  • 按照您的建议从Nodemap<node>派生。如果您设计Nodemap使其成为适当的基类,则这是一种有效的方法。虚拟析构函数建议您已经这样做了,尽管可能根本不需要使方法成为虚拟方法。
  • 如果可能,提供附加功能作为自由函数,因此无需从Nodemap<node>派生或专门化

  • 我会考虑前两种的混合方法:创建一个包含NodeMapBaseNodeMap的通用功能的基类模板(我将其称为Matching),然后从相应的基类模板派生NodeMap模板(可能无需添加功能),并从Matching导出NodeMapBase<node>。如果您看一下MSVC的标准库实现,将会发现很多东西。

    关于c++ - 在固定模板参数的同时扩展模板类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13722941/

    10-09 05:13