什么概念允许容器在基于范围的for循环中使用?

时间:2017-07-07 09:50:57

标签: c++ c++11 for-loop c++-concepts

我有一个实际上是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;
}

所以现在我必须将正确的函数重定向到内部指针才能使其正常工作。哪个C ++概念必须符合MyVector? 如何在内部std::shared_ptrnullptr时,MyVector的行为与空std::vector完全相同(以便在基于范围的基础上不会崩溃)循环,但根本不会进行迭代)?

1 个答案:

答案 0 :(得分:-2)

要回答您的问题,请参阅cppreference documentation

中有关循环的范围说明
{
    auto && __range = range_expression ; 
    auto __begin = begin_expr ;
    auto __end = end_expr ;
    for ( ; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
} 

这句话

  

如果range_expression是类型C的表达式,其具有名为begin的成员和/或名为end的成员(无论此成员的类型或可访问性如何),则begin_expr__range.begin() end_expr__range.end();

  1. 首先,您需要提供begin()方法,end()方法。两者都应该返回某种迭代器类的实例(它们可以是不同类型的!)

  2. begin()返回的迭代器应该支持preincrement运算符和dereference运算符,如上面的解释所推断的那样。

  3. 最后begin()end()返回的迭代器应该与!=相当。