2009-02-11 8 views
0

Le code suivant est-il portable?Comment portable est un typedef STL?

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); 
} 

Plus précisément je remets en question la portabilité de la surcharge sur std :: iterator_traits <> :: difference_type. Si on tape typed, disons, int * (aussi bizzare que cela puisse être, je pense que la norme ne l'interdit pas) alors appeler iseq() pour un tableau d'ints serait ambigu.

Qu'est-ce que la garantie standard à propos de iterator_traits <> typedefs?

Répondre

1

difference_type doit être un type intégral si int* est sorti.

0

Selon Josuttis, devrait utiliser le typedefs afin d'être plus flexible et correctement générique. Tous ses exemples qui ont commencé par quelque chose comme «voici une façon rapide de le faire» ont conduit à des exemples basés sur les typedefs de la STL.

Questions connexes