在修复模板参数的同时扩展模板类

Extending a template class while fixing the template parameter

本文关键字:扩展 参数      更新时间:2023-10-16

我定义了一个类

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

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

是的,它很常用。

class Matching : public NodeMap<node> {
...
};

这取决于Matching的界面应该是什么样子。如果你想提供完全相同的方法加上一些方便的方法,你可以继承它

class Matching : public NodeMap<node> {...};

但是如果Matching不是NodeMap<node>,即提供了不同的接口,则只应将其用作聚合

class Matching {
private:
NodeMap<node> matchingNodes;
public:
// public interface of Matching
bool isProperMatching(Graph& G);
bool match(node u, node v);
...
};

顺便说一句,此建议与NodeMap是否是模板无关。