SOFTWARE > Linguaggi di programmazione e scripting

dead

<< < (2/2)

TheKaneB:
http://stackoverflow.com/questions/10219225/c-create-string-of-text-and-variables

La risposta votata è ottima.
Usa lo String Stream, con l'operatore <<

Rispetto all'uso dell'operatore + sulla stringa stessa, hai il vantaggio di poter usare questa tecnica insieme a buffering, streaming, networking, filesystem, ecc... Se vuoi rendere una tua classe compatibile con questo metodo, devi implementare l'operatore << verso un ostringstream et voilà.

Usato in questo modo è perfettamente type safe e anche molto comodo da scrivere.

TheKaneB:
Considera pure che non scrivo c++ "serio" dal 2010, negli scorsi anni ho usato più Java, PHP e Javascript, per cui sono un po' arrugginito.
Un po' di c++ l'ho usato per un'app Android Qt ma ero quello più skillato del gruppo quindi sono comunque fermo alle mie conoscenze di 5 anni fa.

Z80Fan:

--- Citazione da: legacy - 01 ſettembre 2015, 21:02:08 ---ohhh thanks, io non sono in grado di valutare in toto la bonta' di una soluzione C++
per questo ti chiedevo anche della soluzione GIT qui sopra, che a me .. sembra na roba pessima
molto meglio la soluzione del link che hai postato tu
--- Termina citazione ---

tinyformat è una libreria che ha il preciso scopo di avere delle funzioni di formattazioni simili alla vecchia (s)printf che però sia type-safe e non abbia tutti i vari problemi della printf del C. Per fare questo, invece di andare a ravanare sullo stack come fa la versione C, usano una tecnica che si chiama variadic template, che permette di costruire funzioni che possono accettare un numero qualsiasi di parametri (come la vecchia printf), però allo stesso tempo mantenendo tutte le informazioni sul tipo di dato per ogni parametro.

(Ovviamente con la stessa tecnica puoi anche costruire funzioni di formattazione più avanzate e meno criptiche della printf, ad esempio guarda C++ Format)

Ciò non è oggettivamente migliore o peggiore rispetto a usare ostringstream, solamente diverso.
Un "problema" che ha l'usare gli stream standard è che il formato della stringa non può essere cambiato facilmente a runtime, perchè l'ordine dei valori e la loro formattazione è stabilita in codice; con le funzioni di formattazione simil-printf, puoi farti dare la stringa di formato dall'esterno in modo che l'output possa essere personalizzato dopo la compilazione.
Ciò è un enorme problema di sicurezza usando la printf in C, perchè in C non c'è nessun controllo che la stringa di formato sia "onesta" e non faccia cose strane; nelle versioni C++ (anche quelle più semplici come tinyformat) hai già di base molta più sicurezza poichè l'implementazione non ha bisogno di andare a puntare nello stack "al buio" sperando che ci siano i dati al posto giusto, ma può verificare che il parametro nella stringa di formato e l'effettiva variabile abbiano lo stesso tipo di dato (oppure può fare una conversione).

Se noti, in C++ Format la stringa di formato non ha più bisogno di indicare il tipo di dato da stampare (anche se lo supporta per combatibilità con printf), perchè quell'informazione la ha già dal compilatore, e non c'è pericolo di sbagliare.

Navigazione

[0] Indice dei post

[*] Pagina precedente

Vai alla versione completa