Type des parametres d'entree - Magie des templates ?

Le
mderie
#include <>

typedef int* iter; // Que declarer ici ?

void bubbleSort(iter begin, iter end) { // }

int main()
{
std::vector<int> vi;
std::list<int> li;

vi.push_back(3);
vi.push_back(1);
li.resize(vi.size());
std::copy(vi.begin(), vi.end(), li.begin()); // Copy accepte tout les
iterateurs possibles de tout les types
bubbleSort(vi.begin(), vi.end()); // Mais quid pour une fonction
perso ?

return 0;
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michael Doubez
Le #20774071
On 15 déc, 14:46, mderie
typedef int* iter;  // Que declarer ici ?

void bubbleSort(iter begin, iter end) { //... }


[snip]

bubbleSort() doit être une fonction template:

template<class BidirectionnalIterator>
void bubbleSort(BidirectionnalIterator begin, BidirectionnalIterator
ned)
{
// ...
}

        std::copy(vi.begin(), vi.end(), li.begin()); // Copy acce pte tout les
iterateurs possibles de tout les types...



En entrée, oui mais en sortie (le 3ème paramètre) doit être au mini mum
un OutputIterator.

        bubbleSort(vi.begin(), vi.end()); // Mais quid pour une f onction
perso ?


[snip]

Le template correspondant au type des paramètres d'entrée est
instancié.

--
Michael
James Kanze
Le #20774811
On Dec 15, 2:26 pm, Michael Doubez
On 15 déc, 14:46, mderie


> typedef int* iter; // Que declarer ici ?



> void bubbleSort(iter begin, iter end) { //... }



[snip]



bubbleSort() doit être une fonction template:



template<class BidirectionnalIterator>
void bubbleSort(BidirectionnalIterator begin, BidirectionnalIterator
ned)
{



Elle pourra avoir besoin d'autres types en plus :

typename std::iterator_traits< BidirectionnalIterator
::value_type


tmp;

, etc. Une bonne partie de la génie de la STL, c'est de normaliser
tous
ces typedef, dans les collections, pour les itérateurs, etc., afin de
rendre ces informations disponibles dans les algorithmes.

// ...



}



> std::copy(vi.begin(), vi.end(), li.begin()); // Copy accepte to ut les
> iterateurs possibles de tout les types...



En entrée, oui mais en sortie (le 3ème paramètre) doit être au mi nimum
un OutputIterator.



Et en entrée, un OutputIterator ne fonctionnera pas très bien.

> bubbleSort(vi.begin(), vi.end()); // Mais quid pour une fonctio n
> perso ?



[snip]



Le template correspondant au type des paramètres d'entrée est
instancié.



Et à partir des types des paramètres en entrée, il faut pouvoir
trouver
tous les autres types dont on a besoin.

--
James Kanze
Alp Mestan
Le #20784761
On Dec 15, 5:48 pm, James Kanze
Et à partir des types des paramètres en entrée, il faut pouvoir
trouver
tous les autres types dont on a besoin.



Pour le PO, le mot-clé pour tes recherches pour ce genre de choses
c'est "classes de traits" ('trait classes' en anglais).
Ca permet d'associer des types, constantes et fonctions statiques à
(généralement) un type, passé en paramètre à ce 'trait' justement . Ca
marche aussi pour plusieurs types ainsi que des constantes, mais le
plus souvent cela ne travaille que sur un type.

Exemples dans la STL : iterator_traits, char_traits, numeric_limits.
James Kanze
Le #20785571
On Dec 17, 12:22 am, Alp Mestan
On Dec 15, 5:48 pm, James Kanze


> Et à partir des types des paramètres en entrée, il faut pouvoir
> trouver tous les autres types dont on a besoin.



Pour le PO, le mot-clé pour tes recherches pour ce genre de choses
c'est "classes de traits" ('trait classes' en anglais). Ca permet
d'associer des types, constantes et fonctions statiques à
(généralement) un type, passé en paramètre à ce 'trait' justeme nt. Ca
marche aussi pour plusieurs types ainsi que des constantes, mais le
plus souvent cela ne travaille que sur un type.



Exemples dans la STL : iterator_traits, char_traits, numeric_limits.



Oui et non. Dans les contextes où le type n'est pas obligatoirement un
type de classe, les traits permettent à obtenir les typedef
nécessaires,
mais dans les contextes où on a obligatoirement une classe (une
collection, un objet fonctionnel), on peut (et la norme le fait) aussi
bien exiger que ces types soient définis comme membre. De l'autre
côté,
les traits peuvent servir à bien d'autres choses que simplement des
typedef ; la frontière entre traits et stratégie est en fait assez
floue. Le template std::numeric_limits, par exemple, est une classe
de
traits.

--
James Kanze
Mickaël Wolff
Le #20788071
James Kanze a écrit :

les traits peuvent servir à bien d'autres choses que simplement des
typedef ; la frontière entre traits et stratégie est en fait assez
floue. Le template std::numeric_limits, par exemple, est une classe
de
traits.



Tant qu'on parle des classes de trait, comment faut-il comprendre le
mot « trait » ? Le meme sens que dans « chevaux de trait » ou dans «
trait de caractère » ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Jean-Marc Bourguet
Le #20788061
Mickaël Wolff
James Kanze a écrit :

> les traits peuvent servir à bien d'autres choses que simplement des
> typedef ; la frontière entre traits et stratégie est en fait assez
> floue. Le template std::numeric_limits, par exemple, est une classe
> de
> traits.

Tant qu'on parle des classes de trait, comment faut-il comprendre le mot
« trait » ? Le meme sens que dans « chevaux de trait » ou dans « trait de
caractère » ?



trait de caractere.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
James Kanze
Le #20789481
On Dec 17, 3:18 pm, Mickaël Wolff
James Kanze a écrit :



> les traits peuvent servir à bien d'autres choses que simplement des
> typedef ; la frontière entre traits et stratégie est en fait assez
> floue. Le template std::numeric_limits, par exemple, est une classe
> de traits.



Tant qu'on parle des classes de trait, comment faut-il comprendre le
mot « trait » ? Le meme sens que dans « chevaux de trait » ou dan s «
trait de caractère » ?



Trait de caractère. C'est bien la signification du mot en anglais.

--
James Kanze
Mickaël Wolff
Le #20790071
James Kanze a écrit :
Tant qu'on parle des classes de trait, comment faut-il comprendre le
mot « trait » ? Le meme sens que dans « chevaux de trait » ou dans «
trait de caractère » ?



Trait de caractère. C'est bien la signification du mot en anglais.



Merci à tout les deux. C'était bien ce que j'avais compris
initialement, mais à force d'utiliser les traits, leur capacité à
transporter toutes ces informations (sémantiques ?) me faisait penser à
des mules, et donc aux animaux de trait.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Publicité
Poster une réponse
Anonyme