基于范围的循环来自成员函数

时间:2016-08-26 23:51:19

标签: c++ c++11

我有点不确定新的(从c ++ 11开始)基于范围的循环如何在内部工作。

如果我要做某事......

for( auto i : someclass.Elements() )
{
 ...
}

...其中“Elements()”返回一个临时的,是否有任何我可能不知道的副作用?

我将在这个问题的底部添加一个工作原型。

我已经验证了“Elements()”返回的类型是一次创建的,这是我最关心的问题。说实话,这感觉有点容易了,我还没有看到其他地方的实现。

对于上下文,我有一个我创建的XML库,希望能够迭代元素的子元素(“for(auto child:element-> Children()){...}”),它的属性( “for(auto属性:element-> Attributes()({...}”),也许更具体的孩子(“for(auto cats:element-> Children(”cats“)){...} ”

这是一个工作原型:

#include <iostream>
#include <list>
#include <vector>
#include <string>

template< typename T >
class Array
{
public:
    Array()
    {       
    }

    Array( T firstValue )
    {
        m_elements.push_back( firstValue );
    }

    Array( const std::list< T > & values )
    {
        m_elements.insert( m_elements.begin(), values.begin(), values.end() );
    }   

    virtual ~Array() 
    {
    }

    void Add( T value )
    {
        m_elements.push_back( value );
    }

    const T & operator[]( int index ) const
    {
        return m_elements[ index ];
    }   

    size_t Count() const
    {
        return m_elements.size();
    }

    class ElementsIterable
    {
        Array & m_array;
    public:
        ElementsIterable( Array & array ) : m_array( array )
        {
            std::cout << "ElementsIterable Constructed" << std::endl;
        }

        class iterator
        {
        public:
            iterator( Array & array, size_t index )
                : m_array( array ), m_index( index )
            {
            }

            iterator & operator++()
            {
                m_index++;
                return *this;
            }

            bool operator!=( const iterator & itr ) const
            {
                return m_index != itr.m_index;
            }

            const T & operator*() const
            {
                return m_array[ m_index ];
            }

        private:
            Array & m_array;
            size_t m_index;
        };

        iterator begin() {
            return iterator( m_array, 0 );
        }
        iterator end() {
            return iterator( m_array, m_array.Count() );
        }
    };

    ElementsIterable Elements()
    {
        return ElementsIterable( *this );
    }

private:
    std::vector< T > m_elements;
};

int main( int argc, char ** argv )
{
    Array< int > array( { 1, 2, 3 } );
    array.Add( 4 );

    for( auto a : array.Elements() )
    {
        std::cout << a << std::endl;
    }

    return 0;
} 

1 个答案:

答案 0 :(得分:3)

请查看以下页面,了解您可以替换for作为心智模型的具体说明:

Range-based for loop

它不仅适用于临时返回的函数,还可以通过执行for (auto&& i : someclass.Elements())来优化一点。