У меня есть класс, как показано ниже:Предоставление доступа к объектам контейнера в C++
class Foo {
private:
std::map<std::string, Bar*> bars_by_name;
std::map<std::string, Baz*> bazs_by_name;
};
Теперь я хотел бы разрешить пользователю доступ к обоим коллекции, но скрыть детали реализации, что я, хранящую объектов в std :: maps. Вместо этого я хотел бы иметь функции-члены, которые возвращаются, например. const итераторы для коллекций и, возможно, даже пользовательский итератор, который возвращает объекты из обеих коллекций, поскольку Bar и Baz принадлежат к одной и той же иерархии классов. Учитывая стиль, что было бы правильным способом сделать это на C++? В Java я, вероятно, установил бы тип возвращаемого метода в Iterable или обернул бы коллекцию в unmodifiableCollection.
Если вы используете что-то вроде ['any_iterator'] (http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html), вы можете скрыть базовый тип без утечки информации. Вы можете использовать что-то вроде transform_iterator или zip_iterator в качестве посредника, но без использования каких-либо мудрых. – Flexo