cpp <chrono> - 成员类型defenition

时间:2016-04-05 13:53:26

标签: c++11 chrono

我正在学习cpp。我认为memeber类型是属于一个类型的函数/变量。 以下是

中的例子
class person
{
public:
    string name;
    int age;
};

name和age是person类的成员类型(在本例中为成员类)。

最近我开始阅读有关<chrono>库的内容,我开始感到困惑。 例如class system_clock具有time_point成员类型。但另一方面,也有类time_point,它具有Clock成员类型(例如类system_clock)。

如何将类包含sompe类型作为成员类型,并且也是其自己的成员类型的成员类型。

我希望我成功地解释了我的困惑。

1 个答案:

答案 0 :(得分:1)

您将非静态数据成员嵌套成员类型别名混淆。

非静态数据成员的示例包括nameage

class person
{
public:
    string name;
    int age;
};

nameage将值存储在person的特定实例中。他们在左值实例person中有一个地址,因此您可以找到该地址:

person p;
string* np = &p.name;  // this is where p.name lives in memory

嵌套类型别名不占用存储空间。例如:

class person
{
public:
    using name_type = string;
    string name;
    int age;
};

person::name_typestring的类型别名。它不占用存储空间。您可以使用它来创建string

person::name_type x = string{};

system_clock::time_point是以下类型的别名:

time_point<system_clock, system_clock::duration>

time_point::clockClock的类型别名:

time_point<Clock, ...>

因此,time_point<system_clock, system_clock::duration>::clocksystem_clock的类型相同。

system_clock不会存储time_pont。实际上,它根本不存储任何东西(没有非静态数据成员)。

time_point没有时钟作为非静态数据成员。 time_point仅存储duration类型为time_point的第二个模板参数:

template <class Clock, class Duration = typename Clock::duration>
class time_point;

这些类型的别名可能会像这样使用:

system_clock::time_point tp = system_clock::now();

虽然在这里使用auto要容易得多(我的偏好):

auto tp = system_clock::now();

如果您使用通用time_point::clock,则time_point的使用可能会派上用场,并且您需要为now()所测量的时钟调用time_point

template <class TimePoint>
void some_function(TimePoint tp)
{
    using Clock = typename TimePoint::clock;
    auto now = Clock::now();
    ...

后一种用例更为罕见,但如果您需要,则可以使用它。

通常,在了解<chrono>时,大多数人通过阅读有关它的类似教程的信息,查看示例代码或阅读其他有关它的Stack Overflow问题来做得更好。当人们试图通过研究其实施来了解<chrono>时,他们总是对其相对复杂的实施产生强烈的负面反应。

它的实现相对复杂,因为它比timespec等替代方案强大得多。然而,它的日常使用具有非常简单和安全的语法。对于常见用例,您甚至不需要知道所有内容都是模板化的。您可以使用system_clock::now()nanosecondshours等内容。

我建议阅读一些[chrono]-tagged个问题。我还建议您阅读此处的<chrono>提案的部分

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm

委员会本身需要一个关于这个主题的教程,本文包含一个非常好的教程。除非您需要睡眠辅助工具,否则请跳过包含建议措辞的部分。这篇论文有些过时了,有些细节已经改变,但并不多。一个例子是monotonic_clock已被重命名为steady_clock。另一个细节是,constexpr已被慷慨地应用。此后,用户定义的文字被添加到6种具体的持续时间类型中。

最后,Nicolai M. Josuttis' second edition of The C++ Standard Library - A Tutorial and Reference<chrono>上有一个不错的部分。