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

标签 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;
}

所以现在我必须将正确的函数重定向到内部指针才能使其工作。 MyVector 必须符合哪个 C++ 概念? 我如何才能实现当内部 std::shared_ptrnullptr 时,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();

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

  2. begin() 返回的迭代器应该支持预增量运算符和取消引用运算符,正如从上面的解释推断的那样。

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

关于c++ - 什么概念允许容器在基于范围的 for 循环中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44967778/

相关文章:

c++ - xcode 无法使用未知类型命名空间构建 C++

c++ - GCC 是否有编译器提示强制分支预测始终以某种方式进行?

c++ - 父进程不读取表单管道

c++ - 使用 initialization_list 导致歧义的函数重载

c++ - enable_if 使用 constexpr bool 测试不起作用

c++ - 使用 promise 和 future 将值从子线程传递给主线程

r - 如何用向量运算替换双 for 循环

javascript - Array.map() 与 for 循环对字符串进行标题封装

c++ - CUDA C++ : Expected an expression in kernel. cu 文件

python - 使用 'for' 或 'if' 条件在 Python 中创建 CSV 文件