我有点不确定新的(从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;
}
答案 0 :(得分:3)
请查看以下页面,了解您可以替换for
作为心智模型的具体说明:
它不仅适用于临时返回的函数,还可以通过执行for (auto&& i : someclass.Elements())
来优化一点。