Mam klasy jak poniżej:umożliwiając dostęp do obiektów kontenerowych w C++
class Foo {
private:
std::map<std::string, Bar*> bars_by_name;
std::map<std::string, Baz*> bazs_by_name;
};
Teraz chciałbym, aby umożliwić użytkownikowi dostęp do obu zbiorów, ale ukryć szczegóły implementacji, że jestem przechowywaniu obiekty na std :: maps. Zamiast tego chciałbym mieć funkcje członkowskie, które zwracają np. iteratory const dla kolekcji i ewentualnie iterator niestandardowy, który zwraca obiekty z obu kolekcji, ponieważ Bar i Baz należą do tej samej hierarchii klas. Biorąc pod uwagę styl, jaki byłby właściwy sposób robienia tego w C++? W Javie prawdopodobnie ustawię typ powrotu metody na Iterable lub zapakuję kolekcję w UnmodifiableCollection.
Jeśli używasz czegoś takiego jak ['any_iterator'] (http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html), możesz ukryć podstawowy typ bez przeciekania szczegółów. Możesz użyć czegoś takiego jak Transform_iterator Boost lub zip_iterator również jako pośrednika, bez użycia jakichkolwiek innych narzędzi. – Flexo