我正在使用数组创建一个类似于STL的容器。我坚持的一件事是如何实现模板的比较器对象
template <typename K, typename V, typename KeyEqual = myEqualObject<K> >
class Map {
......
}
是否需要在类之外的所有方法主体上重复该模板头?IE
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) {
...
}
另外,我还在努力使用/实现类中的这个额外对象,以检查两个键值是否相同。任何人都可以照亮吗?
我已经研究了这个主题,但是在这种情况下找不到任何示例
是否需要在类之外的所有方法主体上重复该模板头?
您需要所有模板参数,但无需重复默认参数:
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>
用作默认设置,而不是重写自己的版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句