2013-04-09 4 views
8

L'operatore di estrazione aritmetica per std::basic_istream trovi non-virtual overloads for all 8 integer types (caratteri non dell'annuncio che vengono gestiti in modo diverso comunque), e chiama num_get::get, che ha singoli virtual overloads for 6 of them (mancanti versioni firmate di breve e int)Perché num_get e num_put sono asimmetrici?

L'operatore di inserimento aritmetica per std::basic_ostream ha anche non-virtual overloads for all 8 integer types e chiama num_put::put, che ha solo virtual overloads for 4 types, che sono long, long long e le loro varianti senza segno. Per i tipi più piccoli, l'operatore di inserimento esegue promozioni intere.

Perché un vuoto in ciò che è altrimenti un tour-de-force dell'estensibilità dell'utente? Sembra impossibile fornire una gestione definita dall'utente per ogni tipo di intero (ad es. Per costruire una libreria di serializzazione di preservazione del tipo in cima all'interfaccia di iostream), e più difficile, è asimmetrica. Potrebbe essere stato realizzato con poco sforzo. C'è un compromesso?

risposta

4

Secondo Standard C++ Iostreams and Locales:

A prima vista potrebbe sembrare come se le versioni di put() in breve, int, float o sono mancanti. L'intento era di mantenere concisa l'interfaccia della libreria standard e un valore di tipo short o int può essere gestito dalla versione di long. Allo stesso modo, un valore di tipo float può essere gestito dalla versione put() del doppio.

e poi successivamente merito num_get::get():

nuovo, come con num_put :: put(), i tipi che non sono assolutamente necessarie sono omessi.

+0

Ma l'intento della domanda era chiedere perché la modularità è stata decisa contro - ad es. num_put e num_get personalizzati che consentivano l'I/O binario con gli operatori di input/output formattati. –

+0

@ LB--: Credo che sia sufficientemente spiegato in entrambe le risposte. Cosa ti sei perso? –

+0

Non vedo come si applica la logica quando si desidera conservare le informazioni sul tipo in 'num_put', ad esempio per l'output binario. –

4

Durante la lettura dei valori è necessario consentire gli overflow, quindi è necessario un estrattore per ciascun tipo. Quando scrivi valori non lo fai, quindi il tipo più grande è sufficiente. Nei tempi antichi il tipo più grande era long. Quando è stato aggiunto long long, la versione per long è stata mantenuta per compatibilità con le versioni precedenti.