如何在c++迭代器类型中包装std::chrono
How to wrap std::chrono in a c++ iterator type
我正在尝试创建一个可迭代类型,它接收特定持续时间类型的模板参数,例如std::seconds
、std::hours
等,我希望它接收表示指定持续时间的time_points
的值作为参数2,并且能够通过将电流time_point
增加该持续时间的单位或指定的持续时间来在基于范围的for循环中使用这样的构造,类似于以下内容:
DateRange<std::seconds> dr(now() , 50);
for(auto d : dr){
// do something at unit time
}
我试着用这种方式实现
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();
}
"std::chrono::time_point::time_proint(std::chrono::time_point&(":无法将参数1从"std:::chrono::steady_lock::time_point"转换为"const_Duration&"第19行的日期范围
基于范围的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
(如在下一条语句中所做的(将是Undefined Behavior。注意range_expression
的operator++
是如何从不被调用的。
无论是否修复编译器错误(以及DateRange(Time_type_t end)
中缺少初始化(,这种方法都不会起作用。您需要一个迭代器类来保持对DateRange
的引用。该迭代器由begin()
和end()
返回,并且本身具有operator++()
和operator*()
(这将返回适当的time_point
(。
从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;
}
};
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 将函数包装器转换为 std::function
- std::reference_wrapper 打开包装器
- 将 std::vector<double> 从 C++ 包装到 C 以在 Swift 中使用
- std::带有颜色和标题的 clog 包装器无法正确打印整数
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用"std::enable_if"转发包装失败
- std::包含 std::函数回调的多个包装器的向量不起作用
- pybind11:如何包装以 std::vector<double> 为参数以避免数据复制的 C++ 函数
- 在同一接口中包装不同的 std::vector<T>
- 包装 std::istream 时出现问题,移动后unique_ptr不为空
- Swig:如何从SwigpyObject获取包装std :: shared_ptr的值
- SWIG:包装 std::map<key 时编译器错误,val *>
- SWIG-包装STD ::一对串时的内存泄漏
- 包装 std C++功能有时是一个坏主意
- 使用 boost::p ython vector_indexing_suite 包装 std::vector
- 在帮助程序方法中包装 std::get<>
- 包装std::忽略
- 在自定义类中包装std::packaged_task