深くネストされたプライベートデータを特徴とする以下のクラス定義を検討してください。深くネストされたプライベートデータのための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;
};
パブリックインターフェイスを追加して、3つのレベルのそれぞれを反復処理したいとします。この場合
L1::const_iterator begin() const { return inner_data.begin(); }
L1::const_iterator end() const { return inner_data.end(); }
:それは、私たちは以下のメソッドを追加することができますタイプUとTの関連する値を知って、私たちはクライアントがタイプVの各値を反復3つのネストされたループを構築できるようにしたいですイテレータからの結果はペアになり、右側はL2型を参照します。参照はconst
ですが、std :: map型の完全なAPIを公開しています。これはパブリックインターフェイスには望ましくありません。よりクリーンなソリューションは、L2を反復することを可能にするラッパーのみを提供します。しかし、私はSTLコンテナのこの種のカプセル化の標準的な慣用句を見ていないし、最高の場合でも、ソリューションの実装は高度なコードの膨張を引き起こすようです。
この問題の一般的な解決方法は、一般的なC++規約ではうまくいくでしょうか?
あなたのデータ構造を少し入れ子にして再構築したいのではないかと思っています... –