Sie verwirren nicht statische Datenelemente mit verschachtelte Elementtyp Aliase.
Beispiele für nicht-statisches Datenelement sind name
und age
in:
class person
{
public:
string name;
int age;
};
name
age
und Speichern von Werten innerhalb einer spezifischen Instanz von person
. Sie haben eine Adresse in einer L-Wert-Instanz von person
so können Sie herausfinden, was die Adresse ist:
person p;
string* np = &p.name; // this is where p.name lives in memory
A verschachtelter Typ alias nicht Speicher einnehmen. Zum Beispiel:
class person
{
public:
using name_type = string;
string name;
int age;
};
person::name_type
ist eine Art Alias für string
. Es belegt keinen Speicherplatz. Man könnte es ein string
zu erstellen verwenden:
person::name_type x = string{};
system_clock::time_point
ist eine Art Alias für:
time_point<system_clock, system_clock::duration>
time_point::clock
ist eine Art Alias für Clock
in:
time_point<Clock, ...>
So time_point<system_clock, system_clock::duration>::clock
ist der gleiche Typ wie system_clock
.
system_clock
speichern keine time_pont
. Tatsächlich speichert es überhaupt nichts (keine nicht statischen Datenmitglieder).
time_point
keinen Takt als ein nicht-statisches Datenelement.time_point
speichert nur ein duration
die die Art der time_point
‚s zweiter Template-Parameter in hat:
template <class Clock, class Duration = typename Clock::duration>
class time_point;
wie diese verwendet werden, um diese Art Aliase könnte:
system_clock::time_point tp = system_clock::now();
Obwohl die Verwendung von auto
hier viel einfacher ist, (und meine Vorliebe):
auto tp = system_clock::now();
Verwendung von time_point::clock
könnte nützlich sein, wenn Sie ag hatte ENERIC time_point
und man brauchte now()
auch immer Uhr anrufen, dass time_point
mit gemessen wird:
template <class TimePoint>
void some_function(TimePoint tp)
{
using Clock = typename TimePoint::clock;
auto now = Clock::now();
...
dieser letzteren Anwendungsfall ist selten, aber die Fähigkeit ist es, wenn Sie es brauchen.
Wenn Sie etwas über <chrono>
lernen, tun die meisten Leute es besser, indem Sie tutorialähnliche Informationen darüber lesen oder Beispielcode betrachten oder andere Stack Overflow-Fragen dazu lesen. Wenn Menschen versuchen, etwas über <chrono>
zu lernen, indem sie ihre Implementierung untersuchen, haben sie immer eine stark negative Reaktion auf ihre relativ komplexe Implementierung.
Seine Implementierung ist relativ komplex, weil es viel leistungsfähiger als Alternativen wie timespec
ist. Sein alltäglicher Gebrauch hat jedoch eine sehr einfache und sichere Syntax. Für allgemeine Anwendungsfälle müssen Sie nicht einmal wissen, dass alles auf Vorlagen basiert. Sie können einfach Dinge wie system_clock::now()
, nanoseconds
und hours
verwenden.
Ich empfehle einige der [chrono]-tagged Fragen zu lesen. Ich empfehle auch Teile des <chrono>
Vorschlag hier lesen:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
Der Ausschuss selbst zu diesem Thema ein Tutorial benötigt, und dieses Papier enthält eine ziemlich gute. Überspringen Sie die Teile, die vorgeschlagene Formulierungen enthalten, es sei denn, Sie benötigen eine Schlafhilfe. Das Papier ist etwas altmodisch, da einige Details sich geändert haben, aber nicht viele. Ein Beispiel ist, dass monotonic_clock
seitdem in steady_clock
umbenannt wurde. Ein weiteres Detail ist, dass constexpr
seither großzügig angewendet wurde. Seither wurden den 6 konkreten Durationstypen benutzerdefinierte Literale hinzugefügt.
Schließlich hat Nicolai M. Josuttis' second edition of The C++ Standard Library - A Tutorial and Reference einen schönen Abschnitt auf <chrono>
.
Das Implementieren von '' (oder sogar das Verstehen der Implementierung) ist ein sehr ehrgeiziges Projekt für Anfänger. :-) –
@ Howard Hinnant- Ich muss ... es ist ein Teil eines Codes in Arbeit: -0 – sara8