Я написал небольшой класс "ленивый вектор" (или вектор с задержкой), который должен выглядеть как 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
};
Как я уже сказал, существует проблема, когда функция-член 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
}
};