在模板具有3时,如何在std :: chrono :: duraction_cast中仅提供一种类型的参数

How is possible to give only one type parameter in std::chrono::duraction_cast while the template has 3?

本文关键字:参数 类型 一种 3时 duraction chrono std cast      更新时间:2023-10-16

当我们使用std :: chrono :: duraction_cast时,我们写下这样的东西:

 auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);

我们仅在类型参数中给出一种类型。但是duration_cast的定义是:

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& d);

它有三个参数。

这是怎么可能的?

它基于"模板参数类型扣除"

这就是它的工作原理

通常我们这样做:

auto t2 = std::chrono::high_resolution_clock::now();
// some operations
auto t1 = std::chrono::high_resolution_clock::now();
// then
auto diff = t2 - t1;

T2,T1的类型是:

std::chrono::time_point<std::chrono::high_resolution_clock>

std :: Chrono :: Time_point ,本身是模板类,如下:

template <typename Clock, typename Duration = typename Clock::duration> time_point;

在类型 std :: Chrono :: time_point 中,我们定义操作员 - 喜欢:

template<class C, class D1, class D2>
    typename std::common_type<D1, D2>::type
    operator- (const time_point<C,D1>& pt_lhs, const timpe_point<C,D2>& pt_rhs);

这是一个需要两个

的函数
const time_point<C,D>& 

并返回类型的变量:

std::common_type<D1, D2>::type

两个持续时间之间的常见类型是持续时间本身,即操作员 - 返回类型

的变量
template <class Rep, class Period = std::ratio<1>> class duration;

因此,T2 -T1的类型为:

decltype(t2 - t1) = class duration <class Rep, class Period = std::ratio<1>> 
// <- pseudo code, you cannot write this in C++.

因此,函数的模板参数之一

std::chrono::duration_cast<class ToDuration, class Rep, class Period> 

已经由默认值定义

class Period = std::ratio<1>

此函数的第一个参数由函数本身的参数定义:

class ToDuration = decltype(std::chrono::milliseconds);

我们需要推断函数的第二个模板参数 duration_cast ,我们完成了。

class Rep = decltype(?)

再次,我们从 operator的结果的返回类型 - I.E

decltype(t2 -t1) = template <typename Rep?, class Period = std::ratio<1>>

如果检查模板类的文档持续时间您会发现已定义类Rep 已定义(依赖于STL库的实现者。,linuxos,macos ...),它是整数或浮点(算术类型

完成!!!

所有3个模板参数现在以编译器而闻名:

template <class ToDuration, class Rep, class Period>
        constexpr ToDuration duration_cast(const duration<Rep,Period>& d);
// with
// class ToDuration = std::chrono::milliseconds
// class Rep = arithmetic type relying on the implementation deduced from 
   the return value of std::chrono::high_resolution_clock::now()
// class Period = std::ratio<1> by default and it can be something else
   like std::ratio<0.001> for exple

就是这样,它背后没有魔法,也从来没有解决这种答案:"它的编译器魔术"没有魔术之类的东西,甚至魔术也可以科学地解释。;)

祝你好运。