我有以下模板功能:
template<typename K, typename V>
bool hasKey( const std::map<K, V>& m, K& k ) {
return m.find(k) != m.end();
}
地图中的键不是const
。
现在,我可能有const K
。如何编写一个允许我将K and
const K`传递给函数的模板?
每次调用函数时,解决方案都使用const_cast
吗?
答案 0 :(得分:7)
您可以通过以下
实现您想要的效果template <typename Key, typename Value, typename K>
bool hasKey(const std::map<Key, Value>& mp, const K& k) {
return mp.find(k) != mp.end();
}
通过这种方式,您可以确定在查看函数的声明时,两个操作数都不会被修改,因为它们都是对const
的引用。
密钥类型的非const和const引用(甚至是rvalues)都可以传递给.find()
中的std::map
方法。这是有效的,因为.find()
方法通过const引用接受一个键类型,所以如果你传递一个非const引用它无论如何都会被一个const引用绑定,所以它没有什么区别。
分别模板化键类型可以得到的另一件事是与透明比较器的兼容性(从C ++ 14开始,请参阅http://en.cppreference.com/w/cpp/container/map/find)。有关透明比较器的更多信息,请参阅What are transparent comparators?。
答案 1 :(得分:3)
根据hasKey
:
Map
template<typename Map>
bool hasKey(const Map& m, const typename Map::key_type& k) {
return m.find(k) != m.end();
}