【问题标题】:What concept allows a container to be usable in a range-based for loop? [duplicate]什么概念允许容器在基于范围的 for 循环中可用? [复制]
【发布时间】:2017-12-11 13:47:56
【问题描述】:

我有一个实际上是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 完全相同(这样它就不会在基于范围的循环中崩溃,但不会进行迭代完全)?

【问题讨论】:

  • 为什么会有指向向量的指针?这几乎总是错误的。它应该解决什么问题?
  • 至于你的问题,你检查过吗? this range-for reference?
  • @Someprogrammerdude 它来自我正在使用的 API。什么都不知道:/
  • Range based for 不基于 C++ 概念,这是一个正在考虑标准化的提案。你是这个意思,还是只是想让它起作用?

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


【解决方案1】:

要回答您的问题,请查看 cppreference documentation 中对基于范围的 for 循环的解释

{
    auto && __range = range_expression ; 
    auto __begin = begin_expr ;
    auto __end = end_expr ;
    for ( ; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
} 

还有这句话

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

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

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

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

【讨论】:

  • @Curious 以及如何实现当内部指针为nullptr 时,容器的行为就像一个空的std::vector(用于范围循环目的)?当指针可用时我可以轻松转发begin()end(),但是当指针不存在时我不知道。
  • @nyarlathotep108 使end() 返回一个用nullptr 初始化的迭代器,如果你的容器是空的,begin() 也这样做。然后在比较运算符中比较两者是否有相同的指针,如果是则比较相等
  • @nyarlathotep108:有一个类私有的静态空向量。如果指针为空,则 begin 和 end 可以返回此静态的开始/结束。
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2015-01-15
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
相关资源
最近更新 更多