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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part UTF8String macRomanToUtf8(MacRomanString& str);
J'ai donc travaillé sur le prototype suivant :
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.
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); };
Cette erreur de compilation se produit dans des cas comme celui-ci :
Quel est l'opérateur caché derrière "return _str;" ? Je pensais que c'était operator= mais visiblement pas...
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; }
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
Partager