[英]How to ignore constness in a function template?
我有以下模板功能:
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
吗?
您可以通过以下方式实现您的目标
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)都可以传递给std::map
的.find()
方法。 这是有效的,因为.find()
方法通过const引用接受一个键类型,所以如果你传递一个非const引用它无论如何都会被一个const引用绑定,所以它没有什么区别。
另外,通过模板化键类型得到的另一个方面是与透明比较器的兼容性(自C ++ 14以来,请参阅http://en.cppreference.com/w/cpp/container/map/find )。 有关透明比较器的更多信息,请参见什么是透明比较器? 。
您可以根据Map
的概念使用hasKey
:
template<typename Map>
bool hasKey(const Map& m, const typename Map::key_type& k) {
return m.find(k) != m.end();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.