Poiché std::string
è in realtà un typedef
di una classe basata su modelli, come posso sovrascriverlo? Voglio fare un UTF-8 std::string
che restituirà la lunghezza corretta, tra le altre cose.Ereditarietà e funzioni di override di una stringa std :: string?
risposta
non derivano da STRING
std :: string, cioè, in pratica l'intero template basic_string non è progettato per essere derivato da. Ci sono già milioni di articoli su questo. Non ha funzioni virtuali, quindi non c'è nulla da ignorare. Il meglio che puoi fare è nascondere qualcosa. La cosa migliore è usare la composizione/l'aggregazione! Cioè, mantieni un membro di tipo stringa nella tua classe e inoltra le chiamate! Anche in questo caso, solo per assicurarsi che
non derivano da STRING
Hai guardato terapia intensiva?
Un typedef è solo un'etichetta conveniente.
classe foo: bar pubblico {};
funziona perfettamente quando la barra è un typedef di un PT.
Potrebbe non essere una buona idea in questo caso, ma il linguaggio lo supporta.
In genere è considerato un errore in C++ derivare da un contenitore di libreria standard. Tuttavia, la funzionalità che stai cercando è già stata implementata. Dai un'occhiata a Glib::ustring.
Spero che questo aiuti!
Migliore idea: creare un contenitore utf8_string compatibile con STL senza ereditare da std :: string.
Se è necessario definire un tipo di stringa, quindi non ereditano da std::string
ma definire la propria Character Traits di classe e fare qualcosa di simile
typedef std::basic_string<unsigned char, utf8_traits> utf8string;
Vedi anche Herb Sutter's website.
+1 - c'è una ragione per cui 'std :: string' è un' typedef', e questo è quanto. –
D'altra parte, non userei un 'basic_string' per gestire le sequenze UTF-8. Farai più male che bene ogni volta che proverai a manipolarlo. –
@Matthieu M., che dipende interamente da come si implementano i tratti caratteriali. Riesco a vedere due opzioni: impacchettarle direttamente come UTF-8 e implementare 'state_type', o comprimerle come UTF-32 e convertirle al confine. In ogni caso, è molto lavoro, ma mantiene la compatibilità con gli algoritmi STL. –
Come è già stato affermato da altri: non derivare da std::string
, non è stato progettato per questo.
Si dovrebbe dare un'occhiata a this article, che mostra come creare una classe di stringa senza distinzione tra maiuscole e minuscole come un esempio. Vedrai che la logica implementata in std::basic_string
è indipendente dal tipo di carattere e che fornire un po 'di personalizzazione char_traits
dovrebbe fare il trucco.
In realtà non raccomanderei di farlo. L'ho fatto qualche anno fa e ho dovuto rimpiangere quella decisione. Quello che succederà è che dovrai convertire avanti e indietro tra questo nuovo tipo e il tipo di stringa standard, in tutto il tuo codice base. Non è carino Un grande articolo che spiega in dettaglio è disponibile qui: http://lafstern.org/matt/col2_new.pdf. Riepilogo: l'insensibilità alle maiuscole non riguarda un oggetto, riguarda il modo in cui si utilizza un oggetto. –
Scrivere un'implementazione Unicode conforme e che funzioni correttamente in ogni circostanza è molto difficile. Ti consiglierei di usare una libreria o un'implementazione esistente invece di farla tua. Ad esempio, Windows, OSX e Qt dispongono di librerie che supportano UTF-16 e altre stringhe codificate.
Basta essere sicuri di sapere cosa si sta facendo prima. Qual è esattamente la "lunghezza corretta" che vuoi restituire dai tuoi oggetti stringa? Numero di punti codice?Ciò non corrisponde sempre al numero di caratteri percepito dall'utente.
In ogni caso, dare un'occhiata alla libreria utf8-cpp per vedere un approccio alternativo a derivare da std :: string.
- 1. C++ ereditarietà e override della funzione
- 2. Differenza tra std: string e std :: string
- 3. override di funzioni non virtuali
- 4. Std :: string pool di C++, build di debug? std :: problemi di stringa e valgrind
- 5. Perché gli operatori di confronto std :: vector e std :: string sono definiti come funzioni modello?
- 6. Perché una stringa quotata corrisponde alla firma del metodo bool prima di una stringa std :: string?
- 7. ereditarietà parziale di set di funzioni virtuali sovraccariche
- 8. std :: string :: c_str() restituisce sempre una stringa con terminazione null?
- 9. Ereditarietà e funzioni di fabbrica in Python e Django
- 10. Come costruire una stringa: std :: vector <string>?
- 11. Ordinamento di std :: vector <std :: pair <std :: string, bool >> per la stringa?
- 12. std :: string :: iterator per offset e back
- 13. std :: string e Unicode codificato UTF-8
- 14. Cython C++ e std :: string
- 15. Stringa di override Python __hash__
- 16. Ereditarietà delle funzioni virtuali
- 17. std :: string :: c_str() e provvisori
- 18. Override Funzioni jQuery
- 19. SWIG: come avvolgere std :: string & (std :: string passato per riferimento)
- 20. vantaggio di QString su std :: string
- 21. Sovraccarico di ereditarietà C++ senza funzioni virtuali
- 22. ereditarietà multipla e puri funzioni virtuali
- 23. ereditarietà delle funzioni membro statico
- 24. String o una stringa
- 25. Principio di segregazione di ereditarietà e interfaccia
- 26. C++ std :: string su booleano
- 27. prestazioni std :: strstr vs. std :: string :: trovare
- 28. Concatenazione di un oggetto String null e una stringa letterale
- 29. Cambia colore e carattere di una stringa usando NSAttributo String
- 30. Perché non è std :: string :: max_size() == std :: string :: allocator :: max_size()
-1. La migliore pratica per questo compito è fornire un oggetto Tratti di carattere e creare un'istanza 'std :: basic_string'. Nascondere un 'std :: string' in questo caso solleva il problema della firma' char', poiché UTF-8 è una codifica multibyte a 8 bit. –
@larsmans: Nessuna obiezione :) Ero troppo preoccupato per il fatto che qualcuno da qualche parte avesse il pensiero di derivare da un tipo nonpolymorphic :) –
-1. In realtà non risponde alla domanda. La risposta di Larsman almeno dà una buona idea per una direzione da seguire. – leetNightshade