我有一个容器,它实际上是一个 std::shared_ptr< std::vector< Element > >
。我将这种类型包装到一个 MyVector
类中,因为我不希望人们用指针把事情搞砸:
class MyVector
{
std::shared_ptr< std::vector< Element > > m_vector;
};
我希望能够像这样在基于范围的 MyVector
循环中使用 for
:
int main( )
{
MyVector vector;
// ...
for( const auto& element : vector )
{
// ...
}
return 0;
}
所以现在我必须将正确的函数重定向到内部指针才能使其工作。 MyVector
必须符合哪个 C++ 概念?
我如何才能实现当内部 std::shared_ptr
为 nullptr
时,MyVector
的行为与空 std::vector
完全相同(这样它就不会在基于范围的循环中崩溃,但根本不会进行任何迭代)?
要回答您的问题,请查看 cppreference documentation 中对基于范围的 for 循环的解释。
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
还有这句话
If range_expression is an expression of a class type C that has a member named begin and/or a member named end (regardless of the type or accessibility of such member), then begin_expr
is __range.begin()
and end_expr
is __range.end()
;
所以首先你需要提供一个begin()
方法,一个end()
方法。两者都应该返回某种迭代器类的实例(它们可以是不同的类型!)
begin()
返回的迭代器应该支持预增量运算符和取消引用运算符,正如从上面的解释推断的那样。
最后,begin()
和 end()
返回的迭代器应该与 !=
相当。