2010-11-17 12 views

risposta

15

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

+2

-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. –

+1

@larsmans: Nessuna obiezione :) Ero troppo preoccupato per il fatto che qualcuno da qualche parte avesse il pensiero di derivare da un tipo nonpolymorphic :) –

+0

-1. In realtà non risponde alla domanda. La risposta di Larsman almeno dà una buona idea per una direzione da seguire. – leetNightshade

1
  1. Hai guardato terapia intensiva?

  2. 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.

4

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!

0

Migliore idea: creare un contenitore utf8_string compatibile con STL senza ereditare da std :: string.

19

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.

+0

+1 - c'è una ragione per cui 'std :: string' è un' typedef', e questo è quanto. –

+0

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. –

+3

@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. –

-1

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.

+1

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. –

0

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.

1

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.

Problemi correlati