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

我有一个模板类,类似于:
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;

编辑:

考虑到PaperBirdMaster的请求,您可以将模板的Duration类型限制为std :: chrono :: duration only,这样:

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,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,1> obj1;       // Ok
    MyClass < std::string,std::chrono::milliseconds,1> obj2;  // Ok
    MyClass < std::string,int,1> obj3;                        // Error
    return 0;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...