繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM