使用const-ref getter的const_cast实现引用getter的缺陷

时间:2017-03-15 11:18:24

标签: c++

我有一节课,比如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代码的常用方法是什么?

1 个答案:

答案 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;
};