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

Iva*_*nov 3 c++

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

Ric*_*ges 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;
};
Run Code Online (Sandbox Code Playgroud)