【发布时间】:2016-04-28 00:24:43
【问题描述】:
我想创建一个类,它的构造接受std::chrono::duration 参数并将结果存储在一个成员中,以便我以后可以将它传递给std::this_thread::sleep_for()。
我知道我可以编写一些类似sleep_for 的函数模板,如下所示:
template <typename Rep, typename Period>
void mySleep( std::chrono::duration<Rep, Period> time )
{
std::this_thread::sleep_for(time);
}
这可能是一个类的成员函数。但是下面的情况呢?
class UsesDuration
{
public:
template <typename Rep, typename Period>
UsesDuration( std::chrono::duration<Rep, Period> dur ) :
my_duration(dur) { }
void doSomethingPeriodic()
{
while( some_condition )
{
std::this_thread::sleep_for(my_duration);
somethingInteresting();
}
}
private:
??? my_duration; /* How do I declare this??? */
}
是否有一种干净的方法来保持“抽象”持续时间 A)理想情况下不将整个类转换为模板类,B)通过将类转换为类模板?
【问题讨论】:
-
这是过于复杂的
std::chrono引入的问题之一;我第一次看到这个东西我以为是个笑话。带有两个参数(其中一个与编译时间有理算术有关)的模板只是为了表示持续时间,这纯粹是疯狂。只需使用double来存储秒数,就像任何其他理智的语言一样,忘记所有这些人为的非问题,sleep_for的分辨率比double的分辨率要差得多。 -
为什么不使用其中一种帮助器类型,例如
std::chrono::milliseconds,具体取决于所需的粒度? -
我确实喜欢在秒、纳秒等之间转换的能力。如果你只坚持预定义的类型,你甚至会忘记它是一个可怕的模板。
-
@MatteoItalia:恕我直言,您根本不明白您在说什么。在传播有关它的错误信息之前,请花时间学习它。
-
@MatteoItalia C++ 与其他编程语言有不同的目标,因此显然 C++ 将针对同一问题有不同的解决方案。不使用 double 的原因很简单:没有人愿意使用浮点运算来跟踪性能受限系统的时间。在放弃解决方案之前,您应该了解目标。