在修复模板参数的同时扩展模板类
Extending a template class while fixing the template parameter
我定义了一个类
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>
继承吗?是否有可能(如果是,这是一个好主意)使用固定模板参数扩展模板类?
就您显示的代码告诉我您在做什么而言,您有以下可能性:
- 专门针对
T=node
Nodemap
,以包括您想要的其他方法。为方便起见,您可以键入 defNodemap<node>
到Matching
。但是,这可能会添加非专用模板中方法的一些代码重复。 - 按照您的建议从
Nodemap<node>
派生。如果设计Nodemap
时将其作为适当的基类,则这是一种有效的方法。虚拟析构函数建议你已经这样做了,尽管可能根本不需要使方法成为虚拟方法。 - 如果可能,将附加功能作为免费函数提供,因此无需派生或专门化
Nodemap<node>
我会考虑前两种的混合方法:创建一个包含NodeMap
s 和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
是否是模板无关。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 将元组类型扩展为可变参数模板?
- 嵌套参数包扩展失败
- 模板参数部分中有关包扩展的一些混淆
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 如何使用 std::forward 精确地评估参数包的扩展?
- 参数包没有扩展'...'即使...被使用
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- 如何"unzipping"扩展参数包模式?
- 可变参数函数参数包扩展
- c++非类型参数包扩展
- 可变参数模板类扩展
- 模板 使用数据数组调用函数时扩展参数包
- 将代码移出类定义时未扩展参数包
- 在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- 可变模板包扩展参数id
- 我有一个成员,该成员是指向参数化函数的指针,我可以扩展参数类型吗?