在模板具有3时,如何在std :: chrono :: duraction_cast中仅提供一种类型的参数
How is possible to give only one type parameter in std::chrono::duraction_cast while the template has 3?
当我们使用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
就是这样,它背后没有魔法,也从来没有解决这种答案:"它的编译器魔术"没有魔术之类的东西,甚至魔术也可以科学地解释。;)
祝你好运。
相关文章:
- 扩展C++生成的代码的模板参数类型名称
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 将函数参数类型声明为 auto
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- 在 C++17 中调用具有不同参数类型的构造函数
- 具有先前参数类型匹配的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如何从第一个参数推断第二个参数类型?
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何用不同的参数类型和数字回调函数
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么std::{container}::template不能推导其参数类型
- 为模板参数类型中的新对象分配内存
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 使用std::conditional中的模板来确定函数参数类型
- C++中的短参数类型