gpt4 book ai didi

c++ - 来自成员函数返回的临时值的基于范围的循环

转载 作者:太空狗 更新时间:2023-10-29 21:15:00 25 4
gpt4 key购买 nike

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

如果我要做类似...

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

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

我会在这个问题的底部添加一个工作原型(prototype)。

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

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

这是一个工作原型(prototype):

#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;
}

最佳答案

请查看下一页,了解关于您可以将 for 替换为心智模型的内容的确切描述:

Range-based for loop

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

关于c++ - 来自成员函数返回的临时值的基于范围的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com