除和乘std :: chrono :: durations

het*_*fan 2 c++ c++11 c++-chrono

我正在使用std :: chrono :: duration计算时间随时间的一些变化,以便获得派生和梯形积分的近似值。

我想在一段时间内执行一些常见的操作,但不幸的是未能这样做,可能是因为我对计时的理解不正确。

using std::chrono::milliseconds;
using namespace std;

milliseconds eightms = milliseconds(8);
milliseconds fourms = milliseconds(4);
milliseconds twoms = milliseconds(eightms / fourms); //<-- why do I need this cast?
milliseconds twoms = eightms / fourms;

cout << "twoms = " << twoms.count() << " ms" << endl;
Run Code Online (Sandbox Code Playgroud)

预期的输出将是

twoms = 2毫秒

如果我不使用上面的转换,则会为我得到一个隐秘的编译器错误,当我再次将除法结果转换为毫秒时,它将按预期工作。

dur_div_mult.cpp: In function ‘int main()’:
dur_div_mult.cpp:13:11: error: no match for ‘operator=’ (operand types are ‘std::chrono::milliseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000l> >}’ and ‘std::__success_type<long int>::type {aka long int}’)
     twoms = eightms/fourms;
           ^
In file included from dur_div_mult.cpp:2:0:
/usr/include/c++/5/chrono:274:12: note: candidate: std::chrono::duration<_Rep, _Period>& std::chrono::duration<_Rep, _Period>::operator=(const std::chrono::duration<_Rep, _Period>&) [with _Rep = long int; _Period = std::ratio<1l, 1000l>]
  duration& operator=(const duration&) = default;
        ^
Run Code Online (Sandbox Code Playgroud)

/ usr / include / c ++ / 5 / chrono:274:12:注意:参数1没有从'std :: __ success_type :: type {aka long int}'到'const std :: chrono :: duration>&的已知转换'

同样,将2ms * 4ms与结果相乘也无法正常工作。

twoms = milliseconds(2);
fourms = milliseconds(4);
eightms = twoms * fourms;
cout << "eightms = " << eightms.count() << " ms" << endl;
Run Code Online (Sandbox Code Playgroud)

预期输出为:

8毫秒= 8毫秒

dur_div_mult.cpp: In function ‘int main()’:
dur_div_mult.cpp:18:21: error: no match for ‘operator*’ (operand types are ‘std::chrono::milliseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000l> >}’ and ‘std::chrono::milliseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000l> >}’)
     eightms = twoms * fourms;
                     ^
In file included from dur_div_mult.cpp:2:0:
/usr/include/c++/5/chrono:424:7: note: candidate: template<class _Rep1, class _Rep2, class _Period> constexpr std::chrono::duration<typename std::chrono::__common_rep_type<_Rep2, _Rep1>::type, _Period> std::chrono::operator*(const _Rep1&, const std::chrono::duration<_Rep, _Period>&)
       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
       ^
/usr/include/c++/5/chrono:424:7: note:   template argument deduction/substitution failed:
/usr/include/c++/5/chrono: In substitution of ‘template<class _Rep1, class _Rep2, class _Period> constexpr std::chrono::duration<typename std::chrono::__common_rep_type<_Rep2, _Rep1>::type, _Period> std::chrono::operator*(const _Rep1&, const std::chrono::duration<_Rep, _Period>&) [with _Rep1 = std::chrono::duration<long int, std::ratio<1l, 1000l> >; _Rep2 = long int; _Period = std::ratio<1l, 1000l>]’:
dur_div_mult.cpp:18:23:   required from here
/usr/include/c++/5/chrono:424:7: error: no type named ‘type’ in ‘struct std::common_type<long int, std::chrono::duration<long int, std::ratio<1l, 1000l> > >’
/usr/include/c++/5/chrono:414:7: note: candidate: template<class _Rep1, class _Period, class _Rep2> constexpr std::chrono::duration<typename std::chrono::__common_rep_type<_Rep1, _Rep2>::type, _Period> std::chrono::operator*(const std::chrono::duration<_Rep1, _Period1>&, const _Rep2&)
       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
       ^
/usr/include/c++/5/chrono:414:7: note:   template argument deduction/substitution failed:
/usr/include/c++/5/chrono: In substitution of ‘template<class _Rep1, class _Period, class _Rep2> constexpr std::chrono::duration<typename std::chrono::__common_rep_type<_Rep1, _Rep2>::type, _Period> std::chrono::operator*(const std::chrono::duration<_Rep1, _Period1>&, const _Rep2&) [with _Rep1 = long int; _Period = std::ratio<1l, 1000l>; _Rep2 = std::chrono::duration<long int, std::ratio<1l, 1000l> >]’:
dur_div_mult.cpp:18:23:   required from here
/usr/include/c++/5/chrono:414:7: error: no type named ‘type’ in ‘struct std::common_type<long int, std::chrono::duration<long int, std::ratio<1l, 1000l> > >’
Run Code Online (Sandbox Code Playgroud)

显然我没有正确使用std :: chrono :: duration,但是我在做什么错呢?

How*_*ant 7

<chrono>遵循维度分析规则的严格子集。

A duration有一个时间单位。让我们简短地忽略时间单位,而通常将其简称为T。标量(intdouble等)根本没有单位。

如果将durations它们相乘,将得到T2个单位(但是无法编译,请继续阅读)。如果除以2 durations,则得到标量: T0。如果将a乘以duration标量,则得到T1(正时)。如果将a duration除以标量,则也会得到T1(正时)。

<chrono>提供物理学的一个子集,其中结果可以表示为T1(a duration)或T0(标量)。不允许使用其他指数,并且会导致编译时错误。这不是因为它们是错误的,而是超出了该库的范围。

eightms / fourms结果为标量2

您打算做的是:

milliseconds twoms = eightms / 4;
Run Code Online (Sandbox Code Playgroud)