设计一个懒惰的向量:const的问题

Fra*_*ank 0 c++ lazy-loading const vector

我写了一个小的"懒矢量"类(或延迟矢量),它应该看起来像一个std::vector可用的地方std::vector,但它可以加载它的元素"懒惰",即它将加载元素n(可能还有一些)每当有人访问元素时从磁盘n.(原因是在我的应用程序中,并非所有元素都适合内存.)

这是这个LazyVector类,但是const使用这样一个向量的成员函数存在问题,见下文.

template<class T>
class LazyVector {
  std::vector<T> elems_;
  void fetchElem(unsigned n){
    // load the n-th elem from disk into elems_ etc
  }
public:
  const T& operator[](unsigned n) const {
    fetchElem(n); // ERROR: ... discards qualifiers       
    return elems_[n];
  }
  T& operator[](unsigned n) {
    fetchElem(n);
    return elems_[n];
  }
  // and provide some other std::vector functions
};
Run Code Online (Sandbox Code Playgroud)

正如我所说,当一个const成员函数要求一个元素时,会出现问题LazyVector.根据性质LazyVector,访问元素不是 const,即它将改变vec下面的向量,这在此上下文中是被禁止的.该foo成员函数必须const和不能更改.我怎么解决这个问题?

class Foo {
  LazyVector<const std::string*> vec;
  void fct(int n) const { // fct must be const 
    const std::string* str = vec[n];
    // do something with str 
  }
};
Run Code Online (Sandbox Code Playgroud)

GBe*_*gen 7

您可以在LazyVector类的实现中使用可变成员数据或const_cast.因此,您可以创建消耗类所需的constness幻觉,而不是实际上是const.