我有一节课,比如def get_href(line) :
x = line.find('href=')
if x < 0 : return
ref = line[x+6:].split('"')[0]
if ref.startswith('http:') : return ref
hrefs = []
flux = urlopen('http://www.python.org/')
for line in flux : hrefs.append(get_href(line))
。我想实现两个getter方法,分别返回vector<T>
和T&
。我不想实现它们。相反,我只想实现const版本,然后使用const T&
的非const方法重用其代码。
const_cast
这种方法可能存在哪些陷阱?或者,是否有任何方法可以检查const_cast在任何确切的情况下是否合法?
最后,处理这种重复的const / non-const代码的常用方法是什么?
答案 0 :(得分:5)
一种干净的方法是委托私有模板函数,它可以推导出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;
};