使用const_cast创建非const变量的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用const_cast创建非const变量的方法相关的知识,希望对你有一定的参考价值。

const_cast可以用于创建已经实现的方法的非const版本吗?我想我在这些方面看到了一些东西(推荐使用const方法来完成实际工作),但我不确定它应该如何工作。

Value& const search(key) const {
    // find value with key
    return value;
}

Value& search(key) {
    return const_cast<Value&>(search(key));
}

如果不是这样,那么在没有代码双重性的情况下创建非const函数的推荐方法是什么?

答案

最简单的方法是使用C ++ 17中的as_const

Value& search(key) {
    return const_cast<Value&>(std::as_const(*this).search(key));
}

如果没有它,你可以这样做(或者自己实现,不是很难)

Value& search(key) {
    return const_cast<Value&>(static_cast<const T&>(*this).search(key));
}

其中T是你的类的类型(你可以使用decltype的通用解决方案,但由于decltype(*this)是一个引用类型,它变得非常丑陋)。

你可以看看as_const实现here或通用演员here

另一答案

两种方法。

第一:

namespace notstd{ // backported C++17
  template<class T>
  T const& as_const(T& t){return t;}
  template<class T>
  T const&& as_const(T&& t){return t;}      
}
namespace utility { // not ever in std
  template<class T>
  T& remove_const(T const& t){return const_cast<T&>(t);}
  template<class T>
  T&& remove_const(T const&& t){return const_cast<T&&>(t);}
}

然后:

Value& const search(Key key) const {
  // find value with key
  return value;
}

Value& search(Key key) {
  return utility::remove_const(notstd::as_const(*this).search(key));
}

或者:

Value& const search(Key key) const {
  return search(*this, key);
}

Value& search(Key key) {
  return search(*this, key);
}
private:
  template<class Self>
  friend decltype(auto) search(Self& self, Key key){
    // find value with key
  }

我们将工作委托给朋友模板,其中self可能是const。

以上是关于使用const_cast创建非const变量的方法的主要内容,如果未能解决你的问题,请参考以下文章

const_cast 用法

c++中四种cast转换分别是 ?

在 C++ 中将非 const 转换为 const

条款二:最好使用c++转型操作符

有没有更好的方法来实现成员函数 row() 的 const 版本而不使用 const_cast?

函数 findx() 中是不是有 const_cast<char*> 的替代方法?