隐式转换以适应现有构造函数

时间:2018-05-29 14:31:26

标签: c++ implicit-conversion

我的主要目标是拥有类似的东西:

std::chrono::high_resolution_clock tp4{ 2013, 1,2,10,11,12,-1, 1234 };

所以我创建了一个涵盖tm个对象的类:

struct Tm : std::tm {
    int tm_usecs; // [0, 999999] micros after the sec

    Tm(const int year, const int month, const int mday, const int hour,
       const int min, const int sec, const int usecs, const int isDST = -1)
        : tm_usecs{usecs} {
            tm_year = year - 1900; // [0, 60] since 1900
            tm_mon = month - 1;    // [0, 11] since Jan
            tm_mday = mday;        // [1, 31]
            tm_hour = hour;        // [0, 23] since midnight
            tm_min = min;          // [0, 59] after the hour
            tm_sec = sec;          // [0, 60] after the min
            //         allows for 1 positive leap second
            tm_isdst = isDST;      // [-1...] -1 for unknown, 0 for not DST,
            //         any positive value if DST.
        }
    template <typename Clock_t = std::chrono::high_resolution_clock,
             typename MicroSecond_t = std::chrono::microseconds>
                 auto to_time_point() const -> typename Clock_t::time_point {
                     auto tmp = *this; // hack to get it a const 
                     auto time_c = mktime(&tmp);
                     return Clock_t::from_time_t(time_c) + MicroSecond_t{tm_usecs};
                 }

    operator  std::chrono::high_resolution_clock::time_point () const
    {
        return to_time_point();
    }
};

好的,现在我可以写:

Tm ttt{2013, 1,2,10,11,12,-1, 1234};
std::chrono::high_resolution_clock::time_point tp3{ttt};

std::chrono::high_resolution_clock::time_point tp4{Tm{2013, 1,2,10,11,12,-1, 1234}};

编辑: 这个问题不仅指向编译问题,因为它只是一个错字,你为我解决了。谢谢,抱歉这个蠢事。

但: 有没有办法摆脱代码行中的Tm?问题是:

不能引入额外的构造函数&#34;没有从时钟类型派生。 转换操作员无法随时随地提供帮助&#34;编译器无法看到该类型。所以

 std::chrono::high_resolution_clock::time_point tp4{{2013, 1,2,10,11,12,-1, 1234}};

无法工作。

所以问题就是可能存在一个hack来获取从time_point接受的初始化列表。也许可以用用户定义的演绎指南写一些东西。

从Howards回答我看到了使用用户定义的文字来引入稍后可以转换的类型的想法。谢谢你!

1 个答案:

答案 0 :(得分:1)

high_resolution_clock与人类日历没有可移植的关系。例如,在我的平台(macOS)上,它测量自计算机启动以来的时间。

但你可以瞄准system_clock。虽然目前没有指定时代,但事实上的标准是它测量自1970-01-01 00:00:00 UTC(不包括闰秒)以来的时间。该纪元目前在upcoming C++20 draft中指定。

Here is a free, open-source library, which I have written,使用稍微不同的语法执行您想做的事情:

#include "date/date.h"

int
main()
{
    using namespace date;
    using namespace std::chrono;
    system_clock::time_point tp = sys_days{2013_y/January/2} +
                                      10h + 11min + 12s + 1234us;
}

日期/时间以UTC指定。如果您需要指定相对于时区的日期/时间,则可以additional library来实现。

这两个库也都在C++20 working draft