我尝试创建接收特定时间类型的模板参数的迭代式,说std::seconds,std::hours等等,我希望它获得作为参数2点的值表示time_points指定的持续时间,并能够使用这样的构建在基于循环的范围内,time_point通过以该持续时间或可能具有指定持续时间为单位增加电流,如下所示:
DateRange<std::seconds> dr(now() , 50);
for(auto d : dr){
// do something at unit time
}
Run Code Online (Sandbox Code Playgroud)
我试图用这种方式实现它
using namespace std::chrono;
template<typename Duration , typename Clock_t = high_resolution_clock,
typename Time_type = time_point<Clock_t, typename Duration> , typename
Time_pointer = Time_type* >
class DateRange {
using Time_type_t = typename Time_type::duration;
public:
DateRange(Time_type_t start, Time_type_t end) :
m_begin(start),
m_end(end)
{
}
DateRange(Time_type_t end):
m_begin(Clock_t::now())
{
}
Time_pointer begin(){
return &m_begin;
}
Time_pointer end() {
return &m_end;
}
Time_pointer operator++(){
present +=Duration(1);
return present_point;
}
Time_type operator*(){
return present;
}
private:
Time_type m_begin;
Time_type m_end;
Time_type present;
Time_pointer present_point = &present;
Clock_t l_clock;
};
int main()
{
DateRange<seconds> dr(40s);
dr.operator++();
std::cout << (*dr).time_since_epoch().count();
}
Run Code Online (Sandbox Code Playgroud)
'std :: chrono :: time_point :: time_point(std :: chrono :: time_point &&)':无法将参数1从'std :: chrono :: steady_clock :: time_point'转换为'const _Duration&'DateRange at 19
您返回的值begin最终需要等于您返回的值end一定量++。目前,这是否可能尚未指定,因为您返回指向不同对象的指针。
您可能需要一个单独的iterator类型。
template<typename Duration, typename Clock = high_resolution_clock>
class DateRange {
using Time_type = time_point<Clock, Duration>;
class iterator {
iterator & operator++(){
present += Duration(1);
return *this;
}
iterator operator++(int){
iterator res = *this;
++res;
return res;
}
Time_type * operator->(){
return &present;
}
Time_type operator*(){
return present;
}
Time_type present;
};
Time_type m_begin;
Time_type m_end;
public:
DateRange(Time_type_t start, Time_type_t end) :
m_begin(start),
m_end(end)
{}
DateRange(Time_type_t end) :
m_begin(Clock::now()),
m_end(end)
{}
iterator begin(){
return m_begin;
}
iterator end() {
return m_end;
}
};
Run Code Online (Sandbox Code Playgroud)