考虑以下代码:
它无法编译(关于类型不匹配的丑陋模板错误消息)。 当我尝试切换到错误消息中的类型时(
我的假设是算法不起作用,因为减去两个时间点的结果不是时间点,即伪代码中的这些行存在冲突。
int main()
{
std::vector<std::chrono::steady_clock::time_point> time;
time.push_back(std::chrono::steady_clock::now());
std::this_thread::sleep_for(std::chrono::milliseconds(4));
time.push_back(std::chrono::steady_clock::now());
std::this_thread::sleep_for(std::chrono::milliseconds(7));
time.push_back(std::chrono::steady_clock::now());
std::vector<std::chrono::duration<double>> diffs;
std::adjacent_difference(time.begin(),time.end(),std::back_inserter(diffs));
}
它无法编译(关于类型不匹配的丑陋模板错误消息)。 当我尝试切换到错误消息中的类型时(
std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1, 1000000000>>>
),错误消息会移动。我的假设是算法不起作用,因为减去两个时间点的结果不是时间点,即伪代码中的这些行存在冲突。
template<class InputIt, class OutputIt>
constexpr // since C++20
OutputIt adjacent_difference(InputIt first, InputIt last,
OutputIt d_first)
{
if (first == last) return d_first;
typedef typename std::iterator_traits<InputIt>::value_type value_t;
value_t acc = *first;
*d_first = acc; // <----------------------------------------------------- 1
while (++first != last) {
value_t val = *first;
*++d_first = val - std::move(acc); // std::move since C++20 <-------- 2
acc = std::move(val);
}
return ++d_first;
}
所以我有两个问题:
- 我的猜测正确吗?
- 最简单的修复方法是什么?我能想到的最佳解决方法是从时间点转换为持续时间作为中间步骤,但是它不太美观。
尽管chrono是C++11,但由于我对任何C++20的解决方案都持开放态度,因此我将其标记为C++20。尽管我的编译器没有实现ranges,但我更喜欢它们不要成为ranges。
zip
/zip_with
函数。 - Barrytransform
。 - Barry