一个模板方法,用于同时接受常量和非常量参数

A template method to take both const and non-const arguments

本文关键字:常量 参数 非常 用于 一个 模板方法      更新时间:2023-10-16

>我有一个带有以下签名的方法

template <typename T>
bool are_equal(T& lhs, T& rhs) { ... }

它只能接受非常量参数,因为它在仅提供非常量迭代器的遗留类上使用一些 STL 算法。同时,API 的其余部分不一致,因为它提供了对Tconst Tshared_ptr's,所以我必须为 lhs 参数、rhs 或两者做很多are_equal(const_cast<T&>(*lhs_ptr), *rhs_ptr)

有没有办法有一个单一的方法(而不是 4 个重载的方法(,该方法将接受T&const T&参数(或shared_ptr<T>/shared_ptr<const T>的任意组合,并始终在调用are_equal之前将它们转换为T&?我试过玩std::conditionalstd::remove_const,但真的一无所获。

示例:http://coliru.stacked-crooked.com/a/243a98895aa4f6ce

您所要做的就是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));
}