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

C++ Discussion :

Spécialiser std string


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut Spécialiser std string
    Bonjour à tous !

    j'essaye de spécialer la classe std::string, je m'explique :

    je souhaite que dans les signatures de mes méthodes je puisse déterminer quel est le type de chaine attendu, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTF8String macRomanToUtf8(MacRomanString& str);
    De plus, je souhaite que la contrainte soit forte, c'est-à-dire que le compilateur refuse les conversions implicites et l'utilisation de la classe parente.

    J'ai donc travaillé sur le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class UTF8String : public std::string {
        public:
            explicit UTF8String();
            explicit UTF8String(const UTF8String& orig);
            explicit UTF8String(const std::string& other);
            explicit UTF8String(const char* other);
            UTF8String& operator =(const UTF8String& orig);
        };
    J'ai eu au début des tas d'erreurs de compilations difficiles à interpréter, du style "no matching function for call to UTF8String::UTF8String(UTF8String), ce qui est assez logique puisque je n'ai pas d'opérateur ni de constructeur qui permette ca.
    Cette erreur de compilation se produit dans des cas comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UTF8String fn(std::string& str) {
    UTF8String _str = traitement(str);
    return _str;
    }
    Quel est l'opérateur caché derrière "return _str;" ? Je pensais que c'était operator= mais visiblement pas...

    Bon quoi qu'il en soit j'ai du renoncer car le fonctionnement était très instable, j'avais souvent des Segfault à cause de string non initialisée ou des choses comme ca (je pensais que ca ne pouvait pas exister ca... des strings non initialisées). Qu'en pensez-vous ?

    Donc voilà, j'aimerais bien réussir mon pari, mais ca semble particulièrement complexe. Peut-être devrais-je partir vers une encapsulation plutôt qu'une spécialisation ?

    merci à vous

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Points : 120
    Points
    120
    Par défaut
    Salut

    la dérivation n'est pas le bon moyen de customiser la classe string, il faudra plutôt spécialiser la template basic_string avec des traits spécifiques à ce que tu veux, Herb Sutter en parlait dans Exceptionnal++ avec un exemple de std::string notamment

    comme t'indique le compilateur , "return _str" appelle le constructeur par copie, qui renvoie une copie de la variable locale _str qui sera détruite

    Cdt

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Le mieux est probablement encore de spécialiser char_traits, plus que de spécialiser std::string...
    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.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par esteban Voir le message
    j'essaye de spécialer la classe std::string
    Très fortement déconseillé. Myers évoque ce désir funeste dans un de ses bouquins.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. std::string to_string
    Par shirya dans le forum SL & STL
    Réponses: 5
    Dernier message: 20/12/2005, 15h28
  2. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07

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