我有点不确定新的(从 c++11 开始)基于范围的循环内部是如何工作的。
如果我要做类似的事情...
for( auto i : someclass.Elements() )
{
...
}
Run Code Online (Sandbox Code Playgroud)
...其中“Elements()”返回临时值,是否有任何我可能不知道的副作用?
我将在这个问题的底部添加一个工作原型。
我已经验证“Elements()”返回的类型被创建一次,这是我最关心的。说实话,这感觉有点太简单了,而且我还没有在其他地方看到过这种实现。
对于上下文,我创建了一个 XML 库,并且希望能够迭代元素的子元素 ("for( auto child: element->Children() ) {...}"),它的属性 ("for( auto attribute : 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;
}
Run Code Online (Sandbox Code Playgroud)
for
请参阅下页,了解可以用什么来替换心智模型的准确描述:
它不仅可以与返回临时的函数一起使用,有时还可以通过执行for (auto&& i : someclass.Elements())
.
归档时间: |
|
查看次数: |
3064 次 |
最近记录: |