Un interessante confronto critico può essere trovato qui.
C++ FQA io
Non esattamente educato, ma fa pensare ...
responsabilità
L'++ FQA C (che è una risposta critica alle FAQ C++) è spesso considerato dalla C++ comunità di uno "scherzo stupido rilasciato da un ragazzo stupido l'ancora non capisco che cosa C++ è o vuole essere "(cit. dal FQA stesso).
Questo tipo di argomentazione vengono spesso utilizzati per la fiamma (o sfuggire) battaglie di religione tra C credenti ++, Altre lingue credenti o atei lingua ciascuno a suo modesto parere convinto di essere in qualcosa di superiore al altro.
Non sono interessato a queste battaglie, mi piace solo stimolare il ragionamento critico sui pro e contro le argomentazioni. Il C++ FQA - in questo senso - ha il vantaggio di posizionare sia l'FQA che le FAQ uno sull'altro, consentendo un confronto immediato. E questo è l'unico motivo per cui l'ho fatto riferimento allo.
A seguito di commenti TonyD, di seguito (serbatoi per loro, mi chiarisco la mia intenzione necessitano di un chiarimento ...), si deve notare che l'OP non sta solo discutendo il <<
e >>
(ne parlo solo in i miei commenti solo per brevità) ma l'intero set di funzioni che costituisce il modello I/O di C e C++.
Con questa idea in mente, pensa anche ad altri linguaggi "imperativi" (Java, Python, D ...) e vedrai che sono tutti più conformi al modello C rispetto al C++. A volte lo rende persino sicuro (ciò che il modello C non è, e questo è il suo principale svantaggio).
Che il mio punto è tutto
Al momento C++ è venuto avanti come corrente principale (1996 o giù di lì) il <iostream.h>
libreria (notare il ".h": pre-ISO) era in una lingua in cui i modelli dove non ancora completamente disponibile, e, in sostanza, nessun supporto sicuro per le funzioni varadic (dobbiamo attendere fino a C++ 11 per ottenerle), ma con funzioni sovraccarico sicuro tipo.
L'idea di ricaricare il parametro <<
ridefinendo il suo primo parametro più e più volte è, in effetti, un modo per concatenare una serie variabile di argomenti utilizzando solo una funzione binaria, che può essere sovraccaricata in un modo sicuro. Questa idea si estende a qualsiasi "funzione di gestione dello stato" (come width()
o precision()
) tramite manipolatori (come setw
) appare come una conseguenza naturale. Questo punto, a parte ciò che puoi dire all'autore FQA, sono fatti reali. Ed è anche un dato di fatto che FQA è l'unico sito che ho trovato che ne parla.
Detto questo, anni più tardi, quando la lingua D è stato progettato partendo offrendo modelli varadic, la funzione writef
è stato aggiunto nella libreria standard D che fornisce una sintassi printf
-come, ma anche di essere perfettamente type-safe. (vedi here)
Al giorno d'oggi il C++ 11 ha anche modelli varadici ... quindi lo stesso approccio può essere messo in atto nello stesso modo.
Morale della favola
Sia C++ e modelli IO C appaiono rispetto "obsoleti" per uno stile moderno programmazione. C mantenimento della velocità, sicurezza del tipo C++ e "astrazione più flessibile per la localizzazione" (ma mi chiedo quanti programmatori C++ sono al mondo che sono a conoscenza di localizzazioni e sfaccettature ...) a un costo di runtime (jut track con un debugger il < di un numero, passando per lo stream, il buffer locale e il facet ... e tutte le relative funzioni virtuali!).
Il modello C, è anche facilmente estensibile ai messaggi parametrici (quello l'ordine dei parametri dipende dalla localizzazione del testo sono in) con stringhe di formato come
@ 1% d @ 2% i permettendo di scrostare come "text @2%i text @1%d ..."
Il modello C++ non ha il concetto di "stringa di formato": l'ordine dei parametri è fisso ed è identificato con il testo.
Ma C++ 11 modelli varadic possono essere utilizzati per fornire un supporto che:
- in grado di offrire sia compile-time e run-time selezione locale
- in grado di offrire sia a tempo di compilazione e di run- L'ordine parametrico
- può offrire il tipo di parametro in fase di compilazione sicurezza
- ... tutto utilizzando una semplice metodologia di stringa di formato.
È tempo di standardizzare un nuovo modello di I/O C++?
Grazie per la rapida risposta Tony. Non ho capito la parte di sicurezza del tipo. In C abbiamo fprintf, giusto? Si prega di approfondire il potenziale incidente. – 0aslam0
Si prega inoltre di elaborare eccezioni generate da iostreams. –
Un'altra critica agli iostreams è che [sono miseramente lenti] (http://stackoverflow.com/q/4340396/103167) –