首页 > 解决方案 > 接受 const 和非 const 参数的模板方法

问题描述

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

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

它只能接受非常量参数,因为它在只提供非常量迭代器的遗留类上使用了一些 STL 算法。同时,API 的其余部分在提供shared_ptr'sT或提供给的方式上是不一致的,因此我必须为 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::conditionalstd::remove_const但不能真正得到任何地方。

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

标签: c++templatesconstantsc++17

解决方案


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

推荐阅读