Скажем, у меня есть класс:
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_, difficultSet_;
}
Где insert()
добавляет элемент к easySet_
. Участники difficultSet_
меняются в зависимости от участников easySet_
.
Проблема, с которой я сталкиваюсь, заключается в том, что множественные вставки означают, что difficultSet_
постоянно пересчитывается. Поэтому я хочу, чтобы difficultSet_
вычислялся лениво (т. е. только при вызове difficultBegin()
, difficultEnd()
или difficultSize()
). Проблема в том, что тогда мне действительно нужно превратить difficultSet_
в mutable
, иначе difficultSize()
не сможет с ним работать.
Итак, теперь мое объявление класса выглядит так
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_;
mutable SetType difficultSet_;
mutable bool upToDate_;
}
Я чувствую, что это плохой дизайн, хотя. Есть ли способ лучше?