我正在学习cpp。我认为memeber类型是属于一个类型的函数/变量。 以下是
中的例子class person
{
public:
string name;
int age;
};
name和age是person类的成员类型(在本例中为成员类)。
最近我开始阅读有关<chrono>
库的内容,我开始感到困惑。
例如class system_clock
具有time_point
成员类型。但另一方面,也有类time_point
,它具有Clock成员类型(例如类system_clock)。
如何将类包含sompe类型作为成员类型,并且也是其自己的成员类型的成员类型。
我希望我成功地解释了我的困惑。
答案 0 :(得分:1)
您将非静态数据成员与嵌套成员类型别名混淆。
非静态数据成员的示例包括name
和age
:
class person
{
public:
string name;
int age;
};
name
和age
将值存储在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_type
是string
的类型别名。它不占用存储空间。您可以使用它来创建string
:
person::name_type x = string{};
system_clock::time_point
是以下类型的别名:
time_point<system_clock, system_clock::duration>
time_point::clock
是Clock
的类型别名:
time_point<Clock, ...>
因此,time_point<system_clock, system_clock::duration>::clock
与system_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()
,nanoseconds
和hours
等内容。
我建议阅读一些[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>
上有一个不错的部分。