Переносимый следующий код?
template<typename In>
struct input_sequence_range : public pair<In,In> {
input_sequence_range(In first, In last) : pair<In,In>(first, last) { }
};
template<typename Arr>
input_sequence_range<Arr*> iseq(Arr* a,
typename iterator_traits<Arr*>::difference_type n)
{
return input_sequence_range<Arr*>(a, a + n);
}
template<typename Iter>
input_sequence_range<Iter> iseq(Iter first, Iter last)
{
return input_sequence_range<Iter>(first, last);
}
В частности, я сомневаюсь в переносимости перегрузки на std :: iterator_traits <> :: difference_type. Если он привязан к типу, скажем, int * (как бы странно это ни было; я думаю, что стандарт этого не запрещает), то вызов iseq () для массива целых чисел будет неоднозначным.
Что дает стандартная гарантия для iterator_traits <> typedefs?
2 ответа
difference_type
должен быть целочисленным типом, поэтому int*
отсутствует.
По словам Йосуттиса, вы должны использовать определения типов, чтобы быть более гибкими и универсальными. Все его примеры, которые начинались с чего-то вроде «вот быстрый способ сделать это», привели к примерам, основанным на определениях типов STL.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .