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

时间:2012-12-05 12:08:41

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

3 个答案:

答案 0 :(得分:4)

就你所展示的代码而言,你有以下几种可能性告诉我你在做什么:

  1. Nodemap专门化T=node,以包含您想要的其他方法。为方便起见,您可以输入Nodemap<node>Matching。但是,这可能会在非专用模板中添加一些代码重复。
  2. 按照您的建议从Nodemap<node>导出。如果以一种使其成为正确基类的方式设计Nodemap,这是一种有效的方法。虚拟析构函建议你已经这样做了,尽管可能没有必要让方法虚拟化。
  3. 如果可能,请提供附加功能作为免费功能,因此无需派生或专门化Nodemap<node>
  4. 我会考虑前两个的混合方法:创建一个包含NodeMapBaseNodeMap的常用功能的基类模板(我称之为Matching),然后从相应的基类模板派生NodeMap模板(可能没有添加太多功能),并从Matching派生NodeMapBase<node>。如果您看一下MSVC的标准库实现,那么您会看到很多。

答案 1 :(得分:2)

是的,这是常用的。

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

答案 2 :(得分:2)

这取决于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是否为模板无关。