とstd::vector<int> b
フィールドのクラスをコンストラクタ内にコンストラクタで両方のコンテナに等しいサイズにしたいとします。私が理解から - - reserve()
は完全に安全であると、size_type
パラメータを受け入れることを考えると、私が持っている、特にアピールされていない2つのパラメータを使用して私のコンストラクタ、書き込み:私は何を読んでから、コンテナ<T> :: size_typeをさまざまなタイプTに普遍的に使用する方法はありますか?
MyCtor(std::vector<bool>::size_type size1, std::vector<int>::size_type size2)
{
abortIfNotEqual(size1, size2); // Proceed only if size1 == size2
a.reserve(size1);
b.reserve(size2);
}
を、size_type
ですは通常size_t
と同じ、少なくとも標準コンテナのために、私はおそらく今まで潜在的な問題に遭遇することなくこれを行うことができます:
MyCtor(std::size_t size)
{
a.reserve(size); // More readable, but is this always ok?
b.reserve(size);
}
をしかし、厳密にsize_type
を使用するより良い、より安全な方法があります特定のタイプT
の特定のcontainer<T>
でアクセスする必要はありませんか?
具体的なcontainer<T>
を使用することは、例えば、要素へのアクセス:a[i]
、i
はstd::vector<bool>::size_type
でなければなりません。 unsigned int i
は安全性が低くなります。
このような状況では、一般的で普遍的な読みやすい方法がありますか?または、私は単にsize_t
またはunsigned long int
を使用してこれを忘れてしまってはいけませんか?
私はそれがないと知っていますしかし、あなたは 'std :: int64_t'を使うこともできますし、両方を使うこともできます。関数を呼び出すときに偶然に負の値を生成した人はいません。著名な委員からの同様のアドバイスを聞きたい場合: https://channel9.msdn.com/Events/GoingNative/2013/Interactive-Panel-Ask-Us-Anything 9:50、42:40、1:02: 50 –
Btw、あなたの質問への直接的な答えはおそらく 'std :: common_type'でしょうが、やはりそれは過度だと思います。 –
'std :: size_t'は、割り当てられたメモリの最大サイズを表現するのに十分な大きさでなければならず、ベクトル内のすべてのオブジェクトのサイズが1より大きいため、' std :: size_t'は任意のベクトルのサイズを表すことができます。 – Oliv