c ++ foreach循环使用指针而不是引用

bri*_*ore 5 c++ foreach c++11

我有这个Container类的begin()和end()函数用于c ++ 11 foreach循环:

class Element
{
    //content doesn't matter
};

class Container
{
    Element* elements;
    int size;

    /* constructor, destructor, operators, methods, etc.. */

    Element* begin() { return elements; };
    Element* end()   { return elements + size; };
};
Run Code Online (Sandbox Code Playgroud)

这是一个有效的c ++ 11 foreach循环:

Container container;
for (Element& e : container)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

但现在考虑这个foreach循环:

Container container;
for (Element* e : container)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用foreach循环Element*而不是Element&像这样?
这也有很大的优势,可以防止每次for (Element e : container)都复制元素的键入.

在那种情况下begin(),end()Element**我所知,必须返回.

sizeof(Element)不保证是sizeof(Element*)在大多数情况下它们不匹配.递增指针增量的基本类型大小,sizeof(Element)用于递增Element*sizeof(Element*)递增Element**.

所以前缀operator++()会将指针偏移一个假值,事情变得糟透了.任何想法如何让这个工作?

Bar*_*rry 5

我同意LRiO的看法,你现在拥有的可能是最好的解决方案.它还与标准容器的运行方式相关联,并且为用户提供最少惊喜的路径始终是最佳途径(除非有令人信服的理由分歧).

也就是说,你当然可以得到你想要的行为:

class Container
{
    // ...

    struct iterator {
        Element* e;

        // this is the important one
        Element* operator*() { return e; }

        // the rest are just boilerplate
        iterator& operator++() { ++e; return *this; }
        iterator operator++(int) {
            iterator tmp{e};
            ++*this;
            return tmp;
        }

        bool operator==(iterator rhs) const { return e == rhs.e; }
        bool operator!=(iterator rhs) const { return e != rhs.e; }
    };

    iterator begin() { return {elements}; };
    iterator end()   { return {elements + size}; };
};
Run Code Online (Sandbox Code Playgroud)

您可以考虑从继承std::iterator获取typedef或使用boost::iterator_facade.但这至少可以为您提供功能.