如何在C ++迭代器类型中包装std :: chrono

时间:2018-11-02 08:54:36

标签: c++ iterator

我尝试创建一个可迭代类型,该类型接收特定持续时间类型的模板参数,例如<div bgIMG></div> import { Directive,ElementRef, Renderer2, HostListener } from '@angular/core'; @Directive({ selector: '[bgIMG]' }) export class MyCustomStyleDirective { constructor( renderer: Renderer2, el: ElementRef) { renderer.setStyle(el.nativeElement, 'background-image','http://www.publicdomainpictures.net/pictures/50000/velka/flower-meadow.jpg'); renderer.setStyle(el.nativeElement, 'font-weight','bold'); } } html ----- <div class="container"> <div class="row"> <div bgIMG> <p>some text</p> </div> </div> </div> 等,我希望它接收作为参数的2个值,这些值表示std::seconds的指定持续时间,并可以通过将当前std::hours以该持续时间或指定持续时间的单位增加当前time_points的方式,在基于for循环的范围内使用这种构造,如下所示:

time_point

我试图以这种方式实现

DateRange<std::seconds> dr(now() , 50);
for(auto d : dr){
 // do something at unit time
}

'std :: chrono :: time_point :: time_point(std :: chrono :: time_point &&)':无法将参数1从'std :: chrono :: steady_clock :: time_point'转换为'const _Duration&'DateRange在第19行

2 个答案:

答案 0 :(得分:3)

基于范围的for循环(for ( range_declaration : range_expression ) loop_statement)是this(在您的情况下)的语法糖:

{
    auto && __range = range_expression ;
    auto __begin = __range.begin();
    auto __end = __range.end();
    for ( ; __begin != __end; ++__begin)
    {
        range_declaration = *__begin;
        loop_statement
    }
} 

没有涉及到我们的更详细信息(或在整个C ++版本中如何更改),这解释了为什么您的代码当前无法正常工作。您正在尝试这样做:

  • auto && __range = myDateRange;-好的,我们的范围是DateRange。很好。

  • auto __begin = __range.begin();
    auto __end = __range.end();
    因此__begin__end现在是Time_type* ...这已经看起来很糟糕。

  • 现在,循环将递增__begin,但这是一个TimeType*,它不指向数组。因此,取消引用递增的__begin(在下一条语句中进行)将是未定义行为。请注意,从未operator++中的range_expression被调用。

无论您是否解决了编译器错误(以及DateRange(Time_type_t end)中缺少初始化的问题),这种方法都行不通。您需要一个迭代器类,该类保留对DateRange的引用。该迭代器由begin()end()返回,并具有 self operator++()operator*()(将返回适当的time_point

答案 1 :(得分:1)

print_error()返回的值最终必须等于从BenTen返回的值一定数量的begin。当前,当您返回指向不同对象的指针时,尚不确定是否可行。

您可能需要单独的end类型。

++