2010-11-17 17 views
8

l'intestazione <iostream> ha un compagno <iosfwd> che è sufficiente se solo ho bisogno di puntatori o riferimenti a flussi. Quest'ultimo è uno scenario comune in caso di sovraccarico di operator<<.intestazioni a termine per i contenitori STL

C'è un'intestazione per i contenitori STL? Voglio definire un paio di funzioni che prendono i riferimenti ai contenitori STL, e io non voglio includere <vector>, <list>, <set> et. al. nella loro interezza solo così posso avere riferimenti a quei tipi. Ci sono standard, boost o altre soluzioni a questo problema?

+0

Il "work-around" per questo è utilizzare intestazioni precompilate per includere intestazioni costose come Boost e altre librerie di template Visual C++ ha questi, non è sicuro di altri compilatori .Se lo fai, sii prudente riguardo anche al lavoro- intestazioni in corso, o scoprirai che devi eseguire molte ricostruzioni complete frustranti: –

+0

@up: Esatto, ha anche intestazioni precompilate, ma non sono un utente di quelle e in realtà non sono sicuro riguardo rendimento in termini di rendimento in fase di compilazione di quelli per quanto riguarda i template - da quello che ho sentito, il contenuto di un PCH con i modelli non è molto diverso dal codice sorgente stesso. :) Che suona un po 'logico. – Kos

+0

@Kos: non è previsto che i contenuti siano diversi, ma per ridurre i tempi complessivi di costruzione non dovendo leggere e pre-elaborare i file di intestazione completi in ogni unità di compilazione che ne ha bisogno. –

risposta

1

No, sfortunatamente no. Lo standard ha introdotto solo <iosfwd> per la compatibilità con le versioni precedenti per supportare il codice che è stato scritto per la vecchia libreria di flussi di I/O non basata su modelli.

4

Esiste una tale intestazione per i contenitori STL?

No, non c'è.

Esistono soluzioni standard, boost o altre per questo problema?

Non che io sappia.

Si dovrà includere tali intestazioni.

0

In realtà, perché non sarebbe possibile avere una dichiarazione anticipata classe template?

Se hai un disperato bisogno di una soluzione alternativa, si potrebbe essere in grado di andare con qualcosa di simile:

namespace std { 

    template<typename T> 
    class allocator; 

    template<typename T, typename Alloc> 
    class vector; 
} 

Aggiungi un include guardia, Salva con nome "stdfwd.h" o qualcosa del genere e qui si va.

Poi qualcosa come questo funziona senza includere <vector>:

void print(std::vector<int, std::allocator<int> >& v); 

ha funzionato per me con GCC 4.5. Al momento non ho idea di come creare una soluzione trasparente per il problema che non puoi avere un argomento predefinito (anche argomento template) in dichiarazione e in definizione allo stesso tempo, che .. Ma potrebbe essere possibile - forse qualcuno potrebbe prendere il controllo da qui? :) Non lo userei nel codice di produzione, penso, ma sembra un esercizio interessante.

+4

Sfortunatamente, è illegale aggiungere roba allo spazio dei nomi 'std'. – fredoverflow

+3

I demoni del naso verranno e ti arresteranno –

+1

Questo non è l'unico problema. Le implementazioni sono libere di aggiungere parametri del modello alle classi standard se sono opzionali. Quindi il tuo codice non è conforme agli standard. – wilhelmtell

-1

Con iosfwd è possibile fare perché ci sono solo due tipi i modelli devono essere un'istanza di: char e wchar_t. Quindi quello che ottieni alla fine sono le dichiarazioni anticipate di tipo concreto istanziato. I contenitori STL, d'altra parte, suppongono di funzionare con qualsiasi tipo, quindi non c'è nulla di esplicito nelle intestazioni STL.

+1

'' forward-dichiara i modelli, non le istanze. La dichiarazione in avanti di un'istanza di modello non ha senso in quanto non è qualcosa che puoi dichiarare in primo luogo; solo i nuovi nomi possono essere "dichiarati". La dichiarazione anticipata dei contenitori standard è infatti tecnicamente possibile, non è solo richiesta dallo standard e non è consentita nel codice utente. Ad esempio, supponendo che il modello 'vector' sia esattamente come specificato, la seguente sarebbe una dichiarazione diretta ad esso:' namespace std {template vector class; } ' – boycy

Problemi correlati