Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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::任何表示/期间的持续时间_C++_C++11 - Fatal编程技术网

C++ 接受std::chrono::任何表示/期间的持续时间

C++ 接受std::chrono::任何表示/期间的持续时间,c++,c++11,C++,C++11,我想要一个函数接受调用方认为有意义的任何单位的持续时间 例如: transition->after(chrono::seconds(3)); transition->after(chrono::milliseconds(500)); transition->after(chrono::hours(1)); 在函数之后,此函数的有效签名是什么样的?我可以避免将其作为模板函数吗?有几个常见选项 1) 使用模板。这样做的优点是没有转换,但需要使用模板,这可能是不可能的。例如,如果这

我想要一个函数接受调用方认为有意义的任何单位的持续时间

例如:

transition->after(chrono::seconds(3));
transition->after(chrono::milliseconds(500));
transition->after(chrono::hours(1));

在函数之后,此
函数的有效签名是什么样的?我可以避免将其作为模板函数吗?

有几个常见选项

1) 使用模板。这样做的优点是没有转换,但需要使用模板,这可能是不可能的。例如,如果这是虚拟函数的接口

template<typename Rep, typename Period>
void after( std::chrono::duration< Rep, Period > t);
3) 使用双重表示法,如果精度不是问题,但接受所有输入的能力是问题,则该方法非常有用。这将隐式转换任何持续时间,因为所有期间都允许转换为浮点类型。例如,如果您想要双精度秒,您可以这样做

void after( std::chrono::duration< double > t);
void-after(std::chrono::durationt);

我想说的是,只要接受您内部使用的任何一种,然后让
duration
进行转换。非常感谢您提供了这个出色的答案。你的第二个建议对我很有效。毫无疑问,其他人也将从这种选择中受益,并找到满足他们需求的最佳方法。从c++20开始,也可以在(std::chrono::duration t)之后执行
void:)
void after( std::chrono::duration< double > t);