IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

etendre la STL


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Par défaut etendre la STL
    Bonjour,

    j'aurais voulu surcharger certains operateur de la class string. Je pense avoir un embrayon de solution mais qui hélas ne fonctionne qu'a moitié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    namespace std
    {
    	template<typename T>
    	string operator+(const string &s,const T &t)
    	{
    		string tmp = s;
    		ostringstream oss;
        	oss << t;
    		tmp.append(oss.str());
        	return tmp;		
    	}
    	template<typename T>
    	string & operator+= (string & s,const T &t)		
    	{													
    		return (s = s + t);				
    	}
     
    	template<typename T>
    	string & operator<< (string & s,const T &t)		
    	{													
    		return (s = s + t);				
    	}
    }
    Ce code fonctionne très bien, exepté pour les types déjà surchargé... existe il une solution pour palier à ce problème?

    Merci d'avance pour votre réponse

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    La surcharge d'opérateurs ne fonctionne que si l'un des arguments est de type défini par l'utilisateur.

    Ton problème n'est pas soluble à ma connaissance.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par JolyLoic
    La surcharge d'opérateurs ne fonctionne que si l'un des arguments est de type défini par l'utilisateur.
    Est-ce que c'est moi qui suis mal réveillé et que l'évident m'échappe. std::string en est un.

    Ton problème n'est pas soluble à ma connaissance.
    Je ne suis pas sûr de comprendre quel est son problème. J'aimerais un exemple.

    - Il n'a pas le droit de définir des choses dans le namespace std; mais je doute que ça pose un problème pratique.

    - Une fonction normale surchargée avec une fonction template a priorité sur ce dernier. Je me demande, mais je ne suis pas sur, si ce n'est pas la cause de son problème.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Par défaut
    j'aurais voulu etendre la classe string de la stl pour pouvoir ecrire des choses du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::string s;
    s = "test";
    s += 5; //contenu de s: test5

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Quelle erreur as-tu exactement avec ton code ?

    Accessoirement tu ferais mieux de coder operator+ avec operator+= et pas l'inverse.

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Sinon, dans le pire des cas, tu wrap std::string dans une autre classe, avec tes opérateurs à toi définis dans cette classe, se servant de ceux de std::string.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Est-ce que c'est moi qui suis mal réveillé et que l'évident m'échappe. std::string en est un.
    Non, non, c'était moi... J'ai cru qu'il fallait qu'un paramètre soit un type défini par l'utilisateur, alors que ce qui est dans std:: est défini dans le standard. La vraie règle est que l'un des arguments doit être une classe, une énumération, ou une référence à une classe ou une énumération. Merci d'avoir rectifié.


    Citation Envoyé par Jean-Marc.Bourguet
    - Une fonction normale surchargée avec une fonction template a priorité sur ce dernier. Je me demande, mais je ne suis pas sur, si ce n'est pas la cause de son problème.
    Effectivement, ça me semble plausible. Ou autre hypothèse : La fonction suivante est déjà définie, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
    operator+(const basic_string<charT,traits,Allocator>& lhs, charT rhs);
    Donc, dans ce cas, s'il écrit string("Tot") + 'o' il devra y avoir résolution de surcharge entre la fonction du standard et sa fonction. Mon "C++ Template, the complete guide" étant au boulot, et n'ayant pas le courage de relire la partie correspondante de la norme, je risque de dire une (autre) bêtise.

    Il me semble que dans ce cas, ce qui compte est de savoir des deux fonctions template est la "plus spécialisée". Dans ce cas toujours, je crois il n'y a pas moyen de les départager selon ce critère d'ordre partiel, et donc que l'appel de fonction est ambigu.

    Maintenant, si son opérateur était lui aussi templatisé en fonction du type de chaîne, alors la fonction du standard qui explicite l'utilisation de char serait préférée à la sienne qui spécifie le type char par argument template, et ça lèverait l'ambiguïté.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    - Il n'a pas le droit de définir des choses dans le namespace std; mais je doute que ça pose un problème pratique.
    Pourquoi?

    Citation Envoyé par loufoque
    Quelle erreur as-tu exactement avec ton code ?
    Ca fonctionne bien tant que je n'utilise pas un des operateurs pour un type déjà défini dans la stl. Le compilateur de pouvant départager les deux fonctions.

    Citation Envoyé par loufoque
    Accessoirement tu ferais mieux de coder operator+ avec operator+= et pas l'inverse.
    Pourquoi?

    Citation Envoyé par Alp
    Sinon, dans le pire des cas, tu wrap std::string dans une autre classe, avec tes opérateurs à toi définis dans cette classe, se servant de ceux de std::string.
    J'aurais voulu pouvoir continuer à utiliser std::string et pouvoir redéfinir les operateurs de manière générique pour tous les types...

    Citation Envoyé par JolyLoic
    Maintenant, si son opérateur était lui aussi templatisé en fonction du type de chaîne, alors la fonction du standard qui explicite l'utilisation de char serait préférée à la sienne qui spécifie le type char par argument template, et ça lèverait l'ambiguïté.
    Je comprend pas bien ce que tu veux dire...


    Merci pour vos réponses

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pour éviter de passer par une variable temporaire.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par randomlyGenerated
    Je comprend pas bien ce que tu veux dire...
    Je veux dire (encore une fois, je parle sans mes références sous le coude) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int f (int i, int j); //1
    template <class T> int f(T i, int j); //2
    template <class T> int f(int i, T j); //3
    template <class T, class U> int f(T i, U j); //4
     
    int a, b;
    f(a,b);
    Si on a défini 1 et 2, ou 1 et 3, l'appel de fonction appèlera 1, une fonction non template ayant priorité sur une template. Si on a défini 2 et 3, il y a ambiguïté, les deux fonction étant aussi bonnes. C'est ton cas actuellement. Par contre, si on défini 2 et 4 ou 3 et 4, il me semble que dans ce cas là, 4, qui est plus templatés que 2 ou 3, auras moins la priorité, et c'est l'autre qui sera choisie.

    Dans ton cas, en templatant aussi en fonction du type de chaîne, tu transforme ta fonction de catégorie 3 en fonction de catégorie 4, sachant que le standard en a fourni une de catégorie 2.

    Si ça ne marche pas, ou si tu veux que ce soit une fonction à toi qui soit retenue, et non celle du standard, tu peux aussi définir une fonction de catégorie 1 pour chacun des types qui posent problème (char, char* et string, je crois).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Par défaut
    Merci pour ta proposition mais ça fonctionne pas bien. J'ai des conflis entre les différentes signatures de fonctions.

    J vais tenter de m'en sortir autrement, ça me semble un peu trop hasardeux de vouloir redéfinir des choses dans le namespace std...

Discussions similaires

  1. Etendre la STL
    Par NewbiZ dans le forum SL & STL
    Réponses: 1
    Dernier message: 11/11/2009, 11h42
  2. STL::vector crash a l"execution
    Par sebA dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2004, 16h36
  3. Probleme de Compilation de la STL
    Par stoluup dans le forum MFC
    Réponses: 3
    Dernier message: 05/05/2004, 17h25
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. [Kylix] [BCB] pb avec la STL
    Par pykoon dans le forum EDI
    Réponses: 1
    Dernier message: 29/12/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo