将 std::chrono::d uration 存储为成员的类
Class that stores a std::chrono::duration as a member?
我想创建一个类,该类的构造采用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::duration
:
#include <chrono>
#include <thread>
class UsesDuration
{
public:
UsesDuration( std::chrono::nanoseconds dur ) :
my_duration(dur) { }
void doSomethingPeriodic()
{
while( some_condition )
{
std::this_thread::sleep_for(my_duration);
somethingInteresting();
}
}
void somethingInteresting();
private:
std::chrono::nanoseconds my_duration;
};
int
main()
{
using namespace std::chrono_literals;
UsesDuration x{5min};
}
没有必要对所有内容进行模板化,除非你真的想要这种通用性。 所有预定义单位都隐式转换为 nanoseconds
。 如果您进入客户端发送不会完全转换为nanoseconds
的内容的状态,您将在编译时发现,然后您可以决定是否要模板化,或者可能使用其他解决方案。
另一种解决方案,比存储double
更好,是存储基于双精度的持续时间:
#include <chrono>
#include <thread>
class UsesDuration
{
public:
UsesDuration( std::chrono::duration<double> dur ) :
my_duration(dur) { }
void doSomethingPeriodic()
{
while( some_condition )
{
std::this_thread::sleep_for(my_duration);
somethingInteresting();
}
}
void somethingInteresting();
private:
std::chrono::duration<double> my_duration;
};
int
main()
{
using namespace std::chrono_literals;
UsesDuration x{5min};
}
每个chrono::duration
都将隐式转换为浮点持续时间。 在此示例中,我选择了秒作为精度,并选择了双倍作为表示形式。 你可以选择任何你想要的东西(长双倍和微秒,随便什么)。
你在这里有很多选择。 所有这些都为您提供了裸double
无法提供的类型安全性,并且不会牺牲性能和灵活性。
只需使用双倍即可存储秒数
是你能得到的最糟糕的建议。 学习 <chrono>
. 它具有很大的灵活性,并且其中有很多不需要模板。
我坚持要你学习<chrono>
而不给你一些指示,这也许是不礼貌的。
Nicolai M. Josuttis的"The C++ Standard Library - A Tutorial and Reference, 2nd Edition"对<chrono>
进行了很好的介绍。 光是这一章就可以支付这本书的费用。 确保您获得第 2 版。 他的第一版涵盖了C++03,没有<chrono>
。 披露:我没有安排(财务或其他)来推广尼科的书,尽管他是我的朋友。
对于那些愿意深入研究委员会文件的人来说,<chrono>
提案在这里:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
关于duration
的部分(在内容中链接)是我建议你不耐烦的地方。 它读起来更像是一个教程,而不是一篇技术论文,因为我试图让委员会本身跟上速度。 它包括我在上面的回答中给出的建议,以及更多。
这是一个视频介绍教程:
https://www.youtube.com/watch?v=P32hvk8b13M
我可以看到的一种解决方案是只在类中使用特定的持续时间,然后您可以使用std::chrono::duration_cast
从提供给构造函数的类型转换为用作类成员的类型。 这允许您不对类进行模板化,但仍采用任何类型的持续时间
template <typename Rep, typename Period>
UsesDuration( std::chrono::duration<Rep, Period> dur ) :
my_duration(std::chrono::duration_cast<decltype(my_duration)>(dur)) { }
- 访问存储在向量C++中的结构的多态成员
- 如何创建存储指向成员函数的指针的类 (C++)
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 使用成员函数和存储值定义书籍类
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 通过放置 new 重用数据成员存储
- 如何将提升正常分发存储为类成员
- C++:将未知类型的对象存储为成员变量的类
- structtm是否将时区信息存储为其数据成员
- 是否值得使用位移在单个字节中存储多个小数据成员?
- 将列表迭代器存储为成员
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- 不从成员函数C 存储返回值认为不良习惯
- 将类成员存储为RapidXML数据类型
- 将未使用的类数据成员存储在磁盘上
- OpenGL/ c++将所有纹理资源作为静态成员存储在一个单独的类中
- 将数据成员存储在堆内存中
- 静态constexpr成员存储