我正在使用数组创建一个像STL一样工作的容器。我坚持的一件事是如何将比较器对象实现到模板
template <typename K, typename V, typename KeyEqual = myEqualObject<K> >
class Map {
......
}
是否需要在类外的所有方法体上重复该模板头?即
template <typename K, typename V >
V& Map<K,V>::operator[] (K key) {
...
}
应该是
template <typename K, typename V, typename KeyEqual = myEqualObject<K> >
V& Map<K,V>::operator[] (K key) {
...
}
此外,我正在努力学习如何在我的类中使用/实现这个额外的对象来检查两个键值是否相同。任何人都可以放弃任何光明吗?
我已经浏览了这个主题,但在这个背景下找不到任何例子
答案 0 :(得分:4)
是否需要在类外的所有方法体上重复该模板标题?
您需要所有模板参数,但不需要重复默认参数:
template <typename K, typename V, typename KeyEqual>
V& Map<K,V,KeyEqual>::operator[] (K key) {
...
}
此外,我正在努力学习如何在我的班级中使用/实现这个额外的对象,以检查两个键值是否相同。
按照标准容器的示例,将比较器对象存储在(可能是私有的)成员变量中:
KeyEqual equal;
在构造函数中初始化它,允许用户提供一个:
Map(/* arguments, */ KeyEqual equal = KeyEqual()) :
// initialisers,
equal(equal)
{
// anything else
}
并将其用作二元谓词:
if (equal(key1, key2)) {
// treat them as equal
}
它可以实现为二进制函数类:
template <typename K> struct myEqualObject {
bool operator()(K const & k1, K const & k2) {return k1 == k2;}
};
虽然我使用std::equal_to<K>
作为默认值,而不是重写我自己的版本。