1

GetSize要素の配列を保持するクラスがあり、それにメンバー関数を与えたいと思います。しかし、その関数にどのような戻り型を与える必要がありますか?

私はpimplイディオムを使用しているので、ヘッダーファイルでは、実装が要素を格納するために何を使用するかはわかりません。だから私はただ言うことはできませんstd::vector<T>::size_type、例えば:

class FooImpl;

class Foo {
  FooImpl* impl_;
public:
  TYPE GetSize(); // what TYPE??
};
4

4 に答える 4

1

C++でのサイズのジェネリック型はsize_tです。私はそれを使います。

非技術的な意味でのジェネリックを意味します。これはテンプレートとは何の関係もありません。

これは以前に出てきたようです:いつstd :: size_tを使用する必要がありますか?

編集

多くの議論の後、私は私の答えを少し修正するつもりです。

size_tがポインタと同じ幅の場合は、size_tを使用します。そうでない場合は、ポインタと同じ幅のunsignedintを使用します。

于 2010-02-01T17:02:54.787 に答える
1

クライアントコードが見ることしかできない場合Foo(これはpimplイディオムの目的です)、size_type具体的な実装で特定のものを定義しても意味がありません-とにかくクライアントからは見えません/アクセスできません。標準コンテナは、いわゆる「コンパイル時ポリモーフィズム」に基づいて構築されているため、それを行うことができますが、[潜在的に]ランタイム実装隠蔽メソッドを具体的に使用しようとしています。

あなたの状況では、唯一の選択肢は、「可能なすべての実装に十分なはず」の整数型を選択して(unsigned longたとえば、 など)、それに固執することです。

もう 1 つの可能性はuintptr_t、実装で使用できる場合はその型を使用することです (C99 では標準化されていますが、C++ では標準化されていません)。この整数型は、プログラムで使用可能なストレージ アドレス範囲全体をカバーすることになっています。つまり、メモリ内コンテナーのサイズを表すには常に十分です。他の投稿者も同じロジックを使用することがよくありますが、ここで使用する適切な型は であるという誤った結論に達することに注意してくださいsize_t。(これは通常、非フラット メモリ モデルの実装に関する経験不足の結果です。) コンテナーが常に物理配列に基づいている場合は、size_t動作します。ただし、コンテナーが常に配列ベースではない場合、size_t一般に、その範囲は非連続 (非配列ベース) コンテナーの最大サイズよりも小さいため、ここで使用するのに少しでも正しい型ではありません。

ただし、最終的に使用するサイズに関係なく、標準のコンテナーで行われるのと同じように、typedef 名の後ろに隠すことをお勧めします。

于 2010-02-01T16:38:43.780 に答える
0

STL のリードに従って、に依存するsize_typeaを作成できます。typedefFooImpl

template<typename T> class s_type {
    public:
    typedef size_t type; // good default
};

class FooImpl;

// I'm only doing this specialization to show how it's done
// not because I think it's needed.  In general I'd use size_t.
template<> class s_type<FooImpl> {
    public:
    typedef uintptr_t type;
};

class Foo {
  FooImpl* impl_;

  public:
  typedef size_type s_type<FooImpl>::type;
  size_type GetSize();
};
于 2010-02-01T20:53:31.560 に答える
0

size_type は通常、整数型を隠すために使用されます (short と long と long long など)。独自の を定義するだけFoo::size_typeです。

于 2010-02-01T16:33:35.963 に答える