c++ - 设计惰性 vector : problem with const

标签 c++ vector constants lazy-loading

我写了一个小的“惰性 vector ”类(或延迟 vector ),它应该看起来像一个 std::vector 并且可以在任何一个 std::vector 被使用,但它“延迟”加载其元素,即每当有人访问元素 n 时,它将从磁盘加载元素 n(可能还有更多)。 (原因是在我的应用程序中,并非所有元素都适合内存。)

这是这个 LazyVector 类,但是使用这样一个 vector 的 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
};

正如我所说,当 const 成员函数请求 LazyVector 的元素时会出现问题。根据 LazyVector 的性质,访问元素不是 const,即它会改变下面的 vector 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 
  }
};

最佳答案

您可以在 LazyVector 类的实现中使用可变成员数据或 const_cast。因此,您可以创建消费类所需的常量幻觉,而实际上并不是常量。

关于c++ - 设计惰性 vector : problem with const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/550418/

相关文章:

c++ - 为什么我们可以锁定在 const 对象中定义的互斥量?

c++ - 当 const ref 被原始对象(非常量)替换时,const-ness 会消失吗?

c++ - 无法在 Mac 上使用 Libtiff 写入 TIFF 文件

c++ - $(OutDir) 未设置为项目输出目录

c++ - 修复 std::vector<std::vector<UC>> lum 中调用 'assign' 时出现的错误:没有匹配函数;

c++ - 将大 vector 存储在堆栈中是个坏主意吗?

c++ - const数组更改c++的问题

c++ - GetProcAddress 和函数指针 - 这是正确的吗?

c++ - 是否有 C++ 风格指南质量指标?

C++从函数调用的多个返回构建字符串 vector 的最佳方法