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函数的推荐方法是什么?
答案 0 :(得分:3)
最简单的方法是使用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。
答案 1 :(得分:1)
两种方法。
首先:
Sub AddHour(ByVal ThisSheet As Worksheet)
然后:
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
}
可能是const。