c++ - 在固定模板参数的同时扩展模板类

标签 c++ oop templates inheritance

我定义了一个类

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> ?是否可以(如果可以,这是一个好主意)使用固定模板参数扩展模板类吗?

最佳答案

就您显示的代码告诉我您在做什么而言,您有以下可能性:

  1. 专业 Nodemap对于 T=node , 以包含您想要的其他方法。为了方便起见,您可以输入 def Nodemap<node>Matching .但是,这可能会添加一些您在非专用模板中的方法的代码重复。
  2. 来自 Nodemap<node>正如你所建议的。这是一个有效的方法,如果你设计Nodemap以使其成为适当基类的方式。虚拟析构函数建议您已经这样做了,尽管可能根本没有必要使方法成为虚拟的。
  3. 如果可能,将附加功能作为免费功能提供,这样就无需派生自或专门化 Nodemap<node>

我会考虑前两种方法的混合方法:创建一个包含 NodeMapBase 的通用功能的基类模板(我称之为 NodeMap ) s 和 Matching , 然后导出 NodeMap来自相应基类模板的模板(可能没有添加太多功能)并派生 Matching来自 NodeMapBase<node> .如果您查看 MSVC 的标准库实现,您会发现很多内容。

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

相关文章:

c++ - 无法将参数从 int * 转换为 const int *&

c++ - 如何从 C++ 类中的排序调用比较器函数

c# - 静态字段究竟是如何在内部工作的?

java - 将类存储在 Map 中以便可以实例化它们

python - 我可以在 Django 1.11 中将 {% include %} 与自定义过滤器结合使用吗?

c++ - 使用模板参数列表调用 lambda,不提供参数

c++ - 对临时对象的常量引用不会延长其生命周期

c++ - CCLayerGradient 不会平滑地褪色。怎样才能顺畅呢?

c++ - 有没有类似模板化案例陈述的东西

c++ - 即使有包含保护,链接器也会提示多重定义