我有以下模板功能:
template<typename K, typename V>
bool hasKey( const std::map<K, V>& m, K& k ) {
return m.find(k) != m.end();
}
Run Code Online (Sandbox Code Playgroud)
地图中的键不是const.
现在,我可能有一个const K.如何编写一个允许我将K andconst 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();
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以确定在查看函数的声明时,两个操作数都不会被修改,因为它们都是对它们的引用const.
键和类型的非const和const引用(甚至是rvalues)都可以传递给.find()方法中std::map.这是有效的,因为该.find()方法通过const引用接受一个键类型,所以如果你传递一个非const引用它无论如何都会被一个const引用绑定,所以它没有什么区别.
另外,通过模板化键类型得到的另一个方面是与透明比较器的兼容性(从C++ 14开始,请参阅http://en.cppreference.com/w/cpp/container/map/find).有关透明比较器的更多信息,请参见什么是透明比较器?.