Насколько переносимым является определение типа STL? - PullRequest
0 голосов
/ 11 февраля 2009

Является ли следующий код переносимым?

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 <> :: diff_type. Если это typedeffed, скажем, int * (как бы странно это ни было; я думаю, что стандарт этого не запрещает), то вызов iseq () для массива int будет неоднозначным.

Что стандартная гарантия распространяется на iterator_traits <> typedefs?

Ответы [ 2 ]

1 голос
/ 11 февраля 2009

difference_type должен быть целочисленным, поэтому int* отсутствует.

0 голосов
/ 11 февраля 2009

Согласно Josuttis, вы должны использовать typedef для того, чтобы быть более гибкими и правильно родовыми. Все его примеры, которые начинались с чего-то вроде «вот быстрый способ сделать это», привели к примерам, основанным на определениях типа STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...