如何忽略函数模板中的constness?

时间:2017-07-03 05:21:10

标签: c++

我有以下模板功能:

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吗?

2 个答案:

答案 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();
}