比方说,我有一节课vector<T>.我想实现两个getter方法,分别返回T&和const T&.我不想实现它们.相反,我想只实现const版本,然后在非const方法中重用它的代码const_cast.
template<typename T>
class Vector {
public:
T& operator[](size_t i) {
return const_cast<T&>(
static_cast<const Vector<T>*>(this)->operator[](i));
}
const T& operator[](size_t i) const {
return data[i];
}
private:
T* data;
};
Run Code Online (Sandbox Code Playgroud)
这种方法可能存在哪些陷阱?或者,是否有任何方法可以检查const_cast在任何确切的情况下是否合法?
最后,处理这种重复的const /非const代码的常用方法是什么?
一种干净的方法是委托私有模板函数,它可以推导出以下的常量this:
#include <cstdint>
template<typename T>
class Vector {
public:
T& operator[](std::size_t i) {
return impl_indirection(this, i);
}
const T& operator[](std::size_t i) const {
return impl_indirection(this, i);
}
private:
template<class MaybeConstVector>
static decltype(auto) impl_indirection(MaybeConstVector* pv, std::size_t index)
{
return pv->data[index];
}
T* data;
};
Run Code Online (Sandbox Code Playgroud)