クライアントコードが見ることしかできない場合Foo
(これはpimplイディオムの目的です)、size_type
具体的な実装で特定のものを定義しても意味がありません-とにかくクライアントからは見えません/アクセスできません。標準コンテナは、いわゆる「コンパイル時ポリモーフィズム」に基づいて構築されているため、それを行うことができますが、[潜在的に]ランタイム実装隠蔽メソッドを具体的に使用しようとしています。
あなたの状況では、唯一の選択肢は、「可能なすべての実装に十分なはず」の整数型を選択して(unsigned long
たとえば、 など)、それに固執することです。
もう 1 つの可能性はuintptr_t
、実装で使用できる場合はその型を使用することです (C99 では標準化されていますが、C++ では標準化されていません)。この整数型は、プログラムで使用可能なストレージ アドレス範囲全体をカバーすることになっています。つまり、メモリ内コンテナーのサイズを表すには常に十分です。他の投稿者も同じロジックを使用することがよくありますが、ここで使用する適切な型は であるという誤った結論に達することに注意してくださいsize_t
。(これは通常、非フラット メモリ モデルの実装に関する経験不足の結果です。) コンテナーが常に物理配列に基づいている場合は、size_t
動作します。ただし、コンテナーが常に配列ベースではない場合、size_t
一般に、その範囲は非連続 (非配列ベース) コンテナーの最大サイズよりも小さいため、ここで使用するのに少しでも正しい型ではありません。
ただし、最終的に使用するサイズに関係なく、標準のコンテナーで行われるのと同じように、typedef 名の後ろに隠すことをお勧めします。