c++ - 如何将迭代器调用转发给类的私有成员?
问题描述
我有一堂课,
class A {
public:
// .. public methods
private:
std::list<int> m_list;
};
我想让begin()
andend()
运算符正确地为A
. 所以A.begin(), B.end() == m_list.begin(), m_list.end()
。将所有适当的迭代器调用“转发”给m_list
成员的最佳方式是什么?目标是让所有 STL 算法对我的 A 类“按预期”工作,就好像它真的是一个列表一样。
解决方案
std::list<int>
为了实现这一点,很容易继承而不是组合它。
我知道人们说“不要从标准容器继承”作为一般规则,他们通常在谈论缺少虚拟析构函数,这个基本原理在这里并没有真正发挥作用,因为你不太可能是storagestd::list<int>*
指向您的A
(对吗?我的意思是,您目前显然没有这样做!)。
但是,当您要导出时,即使是“边缘情况”也会在 Windows 上崩溃A
;你最终导出了整个bloomin'标准库,所有的地狱都崩溃了。
这让我们回到……“不要从标准容器继承”。
然后怎样呢?
别名和成员函数。:D
您通常可以只执行以下操作而侥幸成功:
begin()
cbegin()
end()
cend()
rbegin()
crbegin()
rend()
crend()
并将它们直接转发到m_list
,例如
auto begin() { return m_list.begin(); }
auto begin() const { return m_list.begin(); }
auto cbegin() const { return m_list.cbegin(); }
您可能还希望定义一些成员类型,matching std::list
,以实现完全的插入兼容性。这取决于你需要做什么。就我个人而言,我只是在需要时添加转发内容。您可能会发现自己至少需要定义iterator
别名。
推荐阅读
- python-3.x - 数据框中的 KeyError 是否导致不正确的 groupby 应用程序?
- c++ - 内置数组的不完整类型不允许错误
- reactjs - 为 React 创建一个图标库
- android - 我应该将什么“channelId”传递给 NotificationCompat.Builder 的构造函数?
- ruby-on-rails - 当角色名称需要匹配 role_id 时,添加角色选择以设计注册表单(使用设计)
- html - 如何使用 filterPredicate 忽略对空/未定义字段的过滤
- kubernetes - Openshift中的Hazelcast发现:路由器IP的连接重置警告
- r - 在 R 中连接 2 个数据帧
- google-cloud-platform - 用于 pubsub 主题的 setIamPolicy(在资源级别而不是项目)
- wso2 - 重新创建租户时出现 Wso2 问题(创建已删除的租户)。如果我重新启动 wso2 服务器,我可以按预期在 wso2 上创建租户