Учитывая классы
struct Data
{
void bar() const;
void baz();
}
class Foo
{
std::vector<Data> data;
std::map<size_t, Data> indexed_data;
}
Я хотел бы реализовать что-то в классе Foo, чтобы я мог сделать следующее:
int main()
{
Foo foo;
for(const auto& data : foo.data())
data.bar();
for(auto& data : foo.indexed_data())
data.baz();
const auto& foo_ref = foo;
for(auto& data : foo_ref.data())
data.baz(); // constness violated, shouldn't compile
}
Однако я не хочу раскрывать внутренности класса, просто возвращая ссылки на контейнеры. Я также мог бы работать с классами, в которых диапазон, который я хотел бы перебрать, не реализован в виде контейнера. Итак, я в основном хочу создать какой-то прокси-объект, который будет чуть больше, чем оболочка для пары начала/конца, чтобы я мог перебирать несколько вещей внутри своего класса. Кроме того, я хотел бы, чтобы он был правильным, как показано выше. Есть ли какой-нибудь известный шаблон для реализации этого?