在c ++中创建自定义地图类时如何在模板中定义和使用比较器

时间:2013-12-05 15:54:49

标签: c++ templates

我正在使用数组创建一个像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) {
...
}

此外,我正在努力学习如何在我的类中使用/实现这个额外的对象来检查两个键值是否相同。任何人都可以放弃任何光明吗?

我已经浏览了这个主题,但在这个背景下找不到任何例子

1 个答案:

答案 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>作为默认值,而不是重写我自己的版本。