如何使用 std::chrono::duration 作为模板参数?

2024-01-05

我有一个模板类,类似于:

template < typename T, size_t Seconds > class MyClass {}

现在,我想将 Seconds 更改为持续时间,以便该类可以参数化std::chrono::duration。例如,我希望能够这样做:

MyClass < std::string, std::chrono::seconds(30) > object;

另外,在模板中,我想指定一个默认值,例如std::chrono::seconds(30).


您可以巧妙地设计模板:

template < typename T, typename Duration = std::chrono::seconds, int duration_value = 30 > 
class MyClass 
{
    // Now you can use duration here:
    // auto duration = Duration(duration_value);
};

然后你可以将你的模板实例化为

MyClass < std::string, std::chrono::seconds, 30 > object;

或者,实际上将这些值作为默认值,只需

MyClass < std::string > object;

Edit:

考虑在内纸鸟大师的请求,您可以限制模板的Duration类型,成为std::chrono::duration只能这样:

template <typename T>
struct is_chrono_duration
{
    static constexpr bool value = false;
};

template <typename Rep, typename Period>
struct is_chrono_duration<std::chrono::duration<Rep, Period>>
{
    static constexpr bool value = true;
};

template < typename T, typename Duration = std::chrono::seconds, int duration_value = 30 >
class MyClass
{
    static_assert(is_chrono_duration<Duration>::value, "duration must be a std::chrono::duration");
    // Now you can use duration here:
    // auto duration = Duration(duration_value);
};

int main(int argc, char ** argv)
{
    MyClass < std::string, std::chrono::seconds, 1> obj1;       // Ok
    MyClass < std::string, std::chrono::milliseconds, 1> obj2;  // Ok
    MyClass < std::string, int, 1> obj3;                        // Error
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 std::chrono::duration 作为模板参数? 的相关文章

随机推荐