首页 > 解决方案 > 如何将迭代器调用转发给类的私有成员?

问题描述

我有一堂课,

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 类“按预期”工作,就好像它真的是一个列表一样。

标签: c++

解决方案


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别名。


推荐阅读