2016-04-05 4 views
0

私はcppを学んでいます。メンバ型は、ある型に属する関数/変数だと思っていました。 exanpleについては 次cpp <chrono> - メンバータイプdefenition

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

名前と年齢がPersonクラスのメンバ型(この場合はメンバークラス)です。中

最近私は<chrono>ライブラリについて読んで始めました。そして、私は混乱し始めました。 class system_clockのメンバータイプはtime_pointです。しかし、他方では、クロックメンバータイプ(例えば、クラスsystem_clock)を有するクラスtime_pointも存在する。

どのようにしてクラスがsompe型をメンバ型として持つことができるか、それ自身のメンバ型のメンバ型であることができます。

私は私の混乱を説明することができたらうれしいです。

+0

」(または実装の理解さえも)を実装することは、初心者にとって非常に野心的なプロジェクトです。 :-) –

+0

@ Howard Hinnant-私は....仕事のコードの一部です。 – sara8

答えて

1

非スタティックデータメンバーのネストされたメンバータイプの別名を混同しています。 personの特定のインスタンス内部

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

nameage格納値:非静的データメンバ

例はnameageあります。彼らはあなたがそのアドレスが何であるかを知ることができます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の型の別名です。ストレージを占有しません。

time_point<system_clock, system_clock::duration> 

time_point::clockがでClockの型の別名である:

person::name_type x = string{}; 

system_clock::time_pointを行うタイプの別名である:だから

time_point<Clock, ...> 

time_point<system_clock, system_clock::duration>::clockがあるあなたはstring作成するためにそれを使用することができますsystem_clockと同じタイプです。

system_clockは、time_pontを保存しません。実際には、何も格納しません(非静的データメンバーはありません)。

time_pointは、非静的データメンバーとしてのクロックを持っていません。time_pointだけでtime_pointの第2のテンプレートパラメータの型を持つduration格納します。ここでautoの使用は非常に簡単ですが

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

:これらの型の別名は次のように使用される可能性があります

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

を(と私の好み):あなたはAGがあった場合

auto tp = system_clock::now(); 

time_point::clockの利用が便利になるかもしれませんtime_point enericとあなたがtime_pointを用いて測定していることを何でもクロック用now()を呼び出すために必要な:

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

この後者のユースケースは、よりまれですが、あなたがそれを必要とする場合の機能があります。

一般に、<chrono>について学ぶとき、ほとんどの人はチュートリアルのような情報を読んだり、サンプルコードを見たり、それに関する他のスタックオーバーフローの質問を読んだほうが良いでしょう。人々がその実装を研究することによって<chrono>について学ぶことを試みるとき、彼らは常に比較的複雑な実装に対して強い否定的な反応を持っています。

この実装は、timespecなどの代替品よりはるかに強力であるため、比較的複雑です。しかし、一般的な日常的な使用には、非常に簡単で安全な構文があります。一般的な使用例では、すべてがテンプレート化されていることを知る必要はありません。 system_clock::now()nanosecondshoursのようなものを使用できます。

[chrono]-taggedの質問の一部を読むことをお勧めします。

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

自体が、このテーマに関するチュートリアルを必要に応じて委員会、およびこの論文はかなり良いものが含まれています。私はまた<chrono>提案のがここで見つけるの部分を読むことをお勧めします。あなたが睡眠補助を必要としていない限り、提案された言葉を含む部分はスキップしてください。いくつかの詳細は変更されているが、多くは変更されていないという点で、このペーパーは幾分日付が付けられている。 1つの例は、monotonic_clockがその後steady_clockに名前が変更されたことです。もう1つの詳細は、以来constexprが広く適用されているということです。ユーザー定義のリテラルは6つの具体的な継続時間タイプに追加されています。

最後に、Nicolai M. Josuttis' second edition of The C++ Standard Library - A Tutorial and Reference<chrono>という素晴らしいセクションを持っています。