Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::chrono::duration作为模板参数?_C++_Templates_C++11_Stl_Chrono - Fatal编程技术网

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

C++ 如何使用std::chrono::duration作为模板参数?,c++,templates,c++11,stl,chrono,C++,Templates,C++11,Stl,Chrono,我有一个模板类,类似于: template < typename T, size_t Seconds > class MyClass {} 另外,在模板中,我想指定一个默认值,类似于std::chrono::seconds(30)您可以用一种巧妙的方式设计模板: template < typename T, typename Duration = std::chrono::seconds, int duration_value = 30 > class MyClass

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

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

另外,在模板中,我想指定一个默认值,类似于
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
,例如:
MyClass
,这是预期的行为吗?将第二个参数限制为chrono类型不是更好吗?@PaperBirdMaster您的逻辑也可以应用于
std::remove\u if
。如果有人指定了意外的内容,而不是
unaryperedicate p
if而不是迭代器,该怎么办?答案很简单:它不会编译。我们不知道
MyClass
中的逻辑,可能它将使用
double
myu-fancy\u-class
或使用适当的运算符进行编译,而这不可能是预期的行为。。。无论如何,问题是如何使用
std::chrono::duration
参数化类,而不是使用任何行为或类似于
std::chrono::duration
@PaperBirdMaster的东西,然后编写
is\u duration
特征并执行
静态断言。“这很简单,”鸟主人,不,请原谅我的误解。我已经按照你的建议编辑了我的答案。你应该考虑接受下面的答案,这看起来是个可靠的答案。
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;
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;
}