Рассмотрим приведенное ниже определение класса с глубоко вложенными частными данными.Публичные итераторы C++/STL для глубоко вложенных личных данных
template <typename T, typename U, typename V>
class NestedData {
private:
typedef std::vector<V> L3;
typedef std::map<U, L3> L2;
typedef std::map<T, L2> L1;
L1 inner_data;
};
Предположим, мы хотим добавить открытый интерфейс для повторения каждого из трех уровней. То есть, мы хотим, чтобы позволить клиенту построить три вложенных циклов, которые перебирать каждое значение типа V, зная связанные значения типов U и T. Можно добавить следующие методы:
L1::const_iterator begin() const { return inner_data.begin(); }
L1::const_iterator end() const { return inner_data.end(); }
В этом случае , результаты от итератора были бы парами, причем правая сторона ссылалась на тип L2. Хотя ссылка const
, она предоставляет полный API типа std :: map, что нежелательно для открытого интерфейса. Чистое решение предложит только обертку, позволяющую перебирать L2. Тем не менее, я не видел никаких стандартных идиом для такого рода инкапсуляции контейнеров STL, и даже в лучшем случае реализация решения, похоже, создает высокую степень раздувания кода.
Что было бы общим решением этой проблемы, которая хорошо сочетается с общими соглашениями на C++?
Мне интересно, возможно, вы захотите пересмотреть свою структуру данных, чтобы сделать их немного менее «вложенными» ... –