我定义了一个类
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
, 以包含您想要的其他方法。为了方便起见,您可以输入 defNodemap<node>
至Matching
.但是,这可能会添加一些您在非专用模板中的方法的代码重复。 - 来自
Nodemap<node>
正如你所建议的。这是一个有效的方法,如果你设计Nodemap
以使其成为适当基类的方式。虚拟析构函数建议您已经这样做了,尽管可能根本没有必要使方法成为虚拟的。 - 如果可能,将附加功能作为免费功能提供,这样就无需派生自或专门化
Nodemap<node>
我会考虑前两种方法的混合方法:创建一个包含 NodeMapBase
的通用功能的基类模板(我称之为 NodeMap
) s 和 Matching
, 然后导出 NodeMap
来自相应基类模板的模板(可能没有添加太多功能)并派生 Matching
来自 NodeMapBase<node>
.如果您查看 MSVC 的标准库实现,您会发现很多内容。
关于c++ - 在固定模板参数的同时扩展模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722941/