C++ 无缝混搭助力::单位::数量<;时间>;和std::chrono::duration

C++ 无缝混搭助力::单位::数量<;时间>;和std::chrono::duration,c++,chrono,boost-units,C++,Chrono,Boost Units,std::chrono::duration和boost::units::quantity表示相同的物理维度。我要寻找的是一种使用这些类型的可互换值的方法,例如使用数量,其中需要std::clock::duration,反之亦然 请注意,我已经有了一个转换功能,但是手动进行转换感觉很笨拙。编译器应该能够自动进行转换 例如,将chrono_文字分配给数量: quantity<time> q = 2h; 数量q=2h; 我当前的转换功能: /// <summary> ///

std::chrono::duration
boost::units::quantity
表示相同的物理维度。我要寻找的是一种使用这些类型的可互换值的方法,例如使用
数量
,其中需要
std::clock::duration
,反之亦然

请注意,我已经有了一个转换功能,但是手动进行转换感觉很笨拙。编译器应该能够自动进行转换

例如,将chrono_文字分配给数量:

quantity<time> q = 2h;
数量q=2h;
我当前的转换功能:

/// <summary>
/// Convert a std::chrono::duration to a boost::unit time quantity
/// </summary>
/// <typeparam name="_Period1">a std::ratio representing the tick period (i.e. the number of seconds per tick)</typeparam>
/// <typeparam name="_Type">an arithmetic type representing the number of ticks</typeparam>
/// <param name="in">the duration to be converted</param>
/// <returns>the time quantity representing the duration</returns>
template <class _Period1, class _Type> constexpr boost::units::quantity<boost::units::si::time> toBoostTime(std::chrono::duration<_Type, _Period1> in) {
    constexpr auto milli = boost::units::si::milli;
    constexpr auto sec   = boost::units::si::seconds;
    return boost::units::quantity<boost::units::si::time>(std::chrono::duration_cast<std::chrono::milliseconds>(in).count() * milli * sec);
}
//
///将std::chrono::duration转换为boost::unit time数量
/// 
///表示滴答周期的比率(即每滴答的秒数)
///表示记号数的算术类型
///要转换的持续时间
///表示持续时间的时间量
模板constexpr boost::units::数量toBoostTime(std::chrono::持续时间in){
constexpr auto milli=boost::units::si::milli;
constexpr auto sec=boost::units::si::seconds;
返回升压::单位::数量(标准::计时::持续时间_转换(in).count()*毫秒*sec);
}

这有助于展示您迄今为止所做的工作。听起来你神秘的
quantity
类型需要转换其他两种类型的构造函数。但是谁知道呢?@下划线\d我已经用当前的转换函数更新了这个问题。至于“神秘量”:它直接来自boost。没有办法告诉编译器这两个量之间存在隐式转换,您需要在类本身内部添加转换运算符或构造函数。如果您只是想编写既可以接受这两个函数的代码,那么您可以使用模板函数和/或使用variant来接受其中一个,但是没有办法让编译器自动将一个从另一个转换为另一个。@Holt我理解这一点。我曾希望有一些模板魔法,允许用户定义的cast操作符在这些类之外工作。毕竟,Boost和C++标准库都不能改变。