"а что если std::_Array_iterator<_Ty,_Size>::difference_type
и ptrdiff_t
- это разные типы?"Не используйте такой компилятор.Кроме того, есть вероятность, что это не может быть формально другим.Например, это относится к vector
, использующему стандартный распределитель по умолчанию, поскольку именно здесь он выбирает свои typedefs, но поскольку формальная гарантия не имеет значения (хе-хе, на самом деле это не так), я не собираюсь смотретьэто в черновике C ++ 0x.
Итак, используйте ptrdiff_t
.
Но может быть хорошей идеей добавить несколько typedef, например
typedef ptrdiff_t Size;
typedef ptrdiff_t Index;
, а затем в вашем конкретном случае вы будете использовать Index
.
Эти typedefs естественным образом сопровождаются пользовательскими автономными функциями countOf
, startOf
и endOf
, позволяющими обрабатывать необработанные массивы иКонтейнеры стандартной библиотеки точно таким же образом.
Когда вы видите имя Index
, становится немного яснее, что это индекс, который не может быть естественным образом извлечен из Index
или Size
множество типов практически не зависимо от того, что вы делаете.Например, добавьте что-нибудь к этому, это все еще Index
.Так что в основном не будет «еще дюжины предупреждений».
Но в некоторых редких случаях вам нужно будет перейти от Index
до int
, скажем.В и в тех редких случаях просто сделайте static_cast
, чтобы закрыть компилятор и прояснить свои намерения.Или даже пользовательская static_cast
-подобная narrowTo
операция для выразительности ...
Приветствия & hth.,