Domanda

E 'possibile inoltrare dichiarare una classe che utilizza argomenti di default senza specificare o conoscere tali argomenti?

Per esempio, vorrei dichiarare una boost::ptr_list< TYPE > in una classe Tratti senza trascinare l'intera libreria Boost in ogni file che include i tratti. Vorrei dichiarare namespace boost { template<class T> class ptr_list< T >; }, ma che non funziona perché non corrisponde esattamente alla dichiarazione di classe vero:

template < class T,
    class CloneAllocator = heap_clone_allocator,
    class Allocator = std::allocator<void*>
    >
class ptr_list { ... };

sono le opzioni solo per vivere con esso o per specificare boost::ptr_list< TYPE, boost::heap_clone_allocator, std::allocator<void*> nella mia classe tratti? (Se uso la seconda, mi avrete anche a trasmettere dichiarare boost::heap_clone_allocator e comprendono <memory>, suppongo.)

Ho guardato attraverso il libro di Stroustrup, SO, e il resto di Internet e non ho trovato una soluzione. Di solito le persone sono preoccupati che non includono lo STL, e la soluzione è "solo includono le intestazioni STL." Tuttavia, Boost è una libreria molto più massiccia e alta intensità di compilatore, quindi preferisco lasciare fuori a meno che non devo assolutamente.

È stato utile?

Soluzione

Ogni unità di compilazione che utilizza la vostra struttura che previsionali dichiara aumentare roba dovrà includere le intestazioni spinta in ogni caso, salvo nel caso in cui si dispone di alcuni programmi che non effettivamente utilizzare la parte spinta della vostra struttura.

E 'vero che in avanti dichiarando, si può evitare di includere le intestazioni Boost per tali programmi. Ma dovrete includere manualmente le intestazioni boost (o avere un #ifdef) per quei programmi che utilizzano effettivamente la parte spinta.

Tenete a mente che più parametri di template di default potrebbe essere aggiunto in una versione futura Boost. Vorrei consigliare contro questo percorso. Quello che vorrei prendere in considerazione, se il vostro obiettivo è quello di accelerare i tempi di compilazione, è quello di utilizzare un #define per indicare se il codice utilizzando tale libreria Boost deve essere disattivata. In questo modo si evita il fastidio dichiarazione anticipata.

Altri suggerimenti

Sì. argomenti di template di default possono essere specificati in qualsiasi momento e ovunque, a patto che le dichiarazioni non siano in conflitto con l'altro. Essi sono in ultima analisi, fusi insieme dalle varie dichiarazioni.

Anche questo è legale:

template< class A, class B, class C = long >
class X;

template< class A, class B = int, class C >
class X;

template< class A = short, class B, class C >
class X { };

Un esempio simile è dato in §14.1 / 10. Secondo tale punto, gli argomenti della funzione di default si comportano allo stesso modo.

Buona fortuna per ottenere la dichiarazione anticipata di comportarsi e non vomitare su tutto!

Non credo che è possibile inoltrare dichiara un modello con argomenti di default a meno che la libreria in questione fornito la propria intestazione dichiarazione anticipata. Questo perché non è possibile specificare nuovamente gli argomenti di default (anche se corrispondono ... gcc sarà ancora segnalare “l'errore: ridefinizione di argomento di default”).

Quindi, per quanto di mia conoscenza la soluzione è per la libreria per la fornitura di un attaccante intestazione dichiarazione Foo_fwd.h:

#ifndef INCLUDED_Foo_fwd_h_
#define INCLUDED_Foo_fwd_h_
template<class T, class U=char> class Foo; // default U=char up here
#endif

e quindi la piena attuazione in foo.h potrebbe essere:

#ifndef INCLUDED_Foo_h_
#define INCLUDED_Foo_h_
#include "Foo_fwd.h"
template<class T, class U> class Foo { /*...*/ }; // note no U=char here
#endif

Così ora il vostro codice potrebbe utilizzare Foo_fwd.h così ... ma purtroppo, dal momento che questo approccio richiede di modificare l'originale foo.h per rimuovere gli argomenti di default questo non è scalabile alle biblioteche 3rd party. Forse dovremmo pressioni l'equipaggio C ++ 0x per consentire respecification equivalente di argomenti di template di default, à la typedef ...?

Bene stesso problema qui. Ma con STL.

Se uno di mio uso intestazione ad es. std :: vector quindi devo includere l'intera intestazione. Da questo momento ogni volta che mi includo il mio colpo di testa, anche se il mio codice sorgente non si riferisce a std :: vector affatto l'intestazione viene incluso insieme con la mia intestazione. Se si include questa intestazione in un sacco di posto che significherà un sacco di overparsing.

Quindi avanti dichiarato lo std :: vector e usato std :: vector * s', ma il mio codice non voglio compilare a causa delle argomenti di default. Se ho posto gli argomenti di default nel mio colpo di testa poi il compilatore si rifiuta di compilare l'intestazione STL a causa della respectification argomento di default.

Quello che sto cercando di fare in questa situazione sta creando la mia classe Vector che si adatta lo std :: vector e indietro ogni chiamata di metodo ad esso. Probabilmente questo potrebbe risolvere il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top