2011-01-27 14 views
5

C'è, all'interno della libreria standard o Boost, una sorta di classe di base di utilità per popolare una sequenza STL compatibile con i typedef richiesti (size_type, value_type, ecc ...). Sto pensando a qualcosa come boost::iterator_facade, ma per i contenitori.Tipologie di piastre per contenitore compatibile STL

Stavo per arrotolare il mio, ma volevo assicurarmi che una cosa del genere non esistesse già.

UPDATE:

Questa è la classe base di utilità mi è venuta, in caso qualcuno lo trova utile:

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapter semplicemente "Echoes" i typedef nidificati del contenitore sottostante di un contenitore personalizzato. Non c'è niente, davvero.

+0

Le persone usano value_type e iterator perché è più semplice delle alternative, ma io di solito uso value_type & invece di riferimento, ad esempio (e vector è male). Sei sicuro che fornire quegli altri typedef annidati sia vantaggioso per te? Normalmente passo gli elementi alle funzioni in cui verranno associati come cost e comunque, e quel typ_ef_reg_rid_registrato non viene mai toccato. –

+0

@Fred: sono solo preoccupato che il mio contenitore sia compatibile con cose come BOOST_FOREACH, intervalli di boost, std :: back_insertion_iterator, ecc. Se devo solo fornire un sottoinsieme minimo di tutti i typedefs, mi piacerebbe sapere quale. Suppongo sia abbastanza facile sperimentare e scoprire. –

+0

Vero, ma le utilità generali di solito sono scritte per essere agnostiche; 0x auto è ottimo per questo. :) –

risposta

1

anche se esiste, è comunque necessario typedef typename base::size_type size_type. non sembra che guadagneresti molto.

+0

È necessario digitare nuovamente nella classe derivata se si desidera che i typedef siano visibili all'interno della dichiarazione della classe. Gli utenti del contenitore personalizzato vedrebbero comunque tutti i typedef ereditati dalla classe base. Ecco come funziona 'boost :: iterator_facade'. –

+0

@Emilie Lo so, ma assumendo per i contenitori devi fornire operatori e altre cose che useranno questi tipi. – Anycorn

+0

@aaa: Posso sempre usare 'T',' T & ',' const T & ', ecc. Gli unici typedef di cui ho veramente bisogno (all'interno della dichiarazione) sono' iterator' e 'const_iterator'. Tuttavia, ammetto che avere 'reference',' value_type', etc nelle dichiarazioni delle funzioni membro è più carino da un punto di vista della documentazione. –

Problemi correlati