date.h库date::floor<days>返回类型及编译期校验日参数方法
使用HowardHinnant date库定义天级精度参数的函数
在date库中,专门对应天级精度的system_clock时间点的类型是date::sys_days,它本质是std::chrono::time_point<std::chrono::system_clock, date::days>,即以天为刻度的时间点类型。
你可以直接用这个类型定义函数,实现编译期验证参数是否为天级精度:
#include "date/date.h" void startOnDay(date::sys_days day) { // 参数day已经是截断到当天起始时刻的时间点,无需再调用floor<days> // 示例:转换成年月日格式 auto ymd = date::year_month_day{day}; }
为什么这能实现编译期验证?
当你调用date::floor<days>(system_clock::time_point)时,返回值的类型正是sys_days。如果尝试直接传入未截断的system_clock::time_point到startOnDay中,编译器会因为类型不匹配报错——因为system_clock::time_point和sys_days之间没有隐式转换,必须显式调用floor<days>或者用日期构造sys_days后传入。
调用示例
// 方式1:直接用年月日构造sys_days传入 startOnDay(date::year{2024}/4/15); // 方式2:从完整时间点截断后传入 auto now = std::chrono::system_clock::now(); startOnDay(date::floor<days>(now));
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

