【发布时间】:2017-05-14 04:46:20
【问题描述】:
考虑以下具有深度嵌套私有数据的类定义。
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,但它公开了 std::map 类型的完整 API,这对于公共接口来说是不可取的。一个更简洁的解决方案将只提供一个包装器,以使迭代 L2 成为可能。但是,我还没有看到任何用于这种 STL 容器封装的标准习惯用法,即使是最好的情况,解决方案的实现似乎也会造成高度的代码膨胀。
对于这个问题,有什么通用的解决方案可以很好地适应通用 C++ 约定?
【问题讨论】:
-
我想知道您是否想重新考虑您的数据结构以减少它们的“嵌套”...