c++ - 接受 const 和非 const 参数的模板方法
问题描述
我有一个带有以下签名的方法
template <typename T>
bool are_equal(T& lhs, T& rhs) { ... }
它只能接受非常量参数,因为它在只提供非常量迭代器的遗留类上使用了一些 STL 算法。同时,API 的其余部分在提供shared_ptr's
给T
或提供给的方式上是不一致的,因此我必须为 lhs 参数、rhs 或两者都const T
做很多事情。are_equal(const_cast<T&>(*lhs_ptr), *rhs_ptr)
有没有办法让一个方法(而不是 4 个重载的方法)可以采用T&
和const T&
参数的任意组合(或shared_ptr<T>
/shared_ptr<const T>
并总是T&
在调用之前将它们转换为are_equal
?我试过玩std::conditional
,std::remove_const
但不能真正得到任何地方。
解决方案
您所要做的就是const
对所有内容进行限定(允许任何一种参数),然后使用const_cast
:
template <typename T>
bool are_equal(const T& lhs, const T& rhs) {
return detail::are_equal
(const_cast<T&>(lhs),
const_cast<T&>(rhs));
}
推荐阅读
- php - 在 SSL 中如何优雅地处理重定向到 http 的 https URL 的 IMG src
- visual-studio-code - 在 VSCode 中将多行选择变成多光标选择
- php - Laravel:更新作曲家文件时获取状态码 255
- javascript - 响应不可分配给类型 Promise
财产终于不见了? - ansible - 将键名提取到列表中
- css - CSS Grid 自动适应最大内容
- php - PHP require_once 仍然需要多次
- linux - PS1没有设置颜色
- c# - 如何从 Stream 创建 IMediaPlaybackSource,以便在不使用过时的 SetStreamSource 方法的情况下设置 MediaPlayer 源?
- common-lisp - 如何在 sbcl 中找到外星结构的大小?