Attualmente sto facendo qualche metaprogrammazione del modello. Nel mio caso posso gestire qualsiasi tipo "iterabile", cioè qualsiasi tipo per cui esiste uno typedef foo const_iterator
nello stesso modo. Stavo cercando di usare la nuova metaprogrammazione del modello C++ 11 per questo, tuttavia non sono riuscito a trovare un metodo per rilevare se manca un determinato tipo.rilevamento typedef in fase di compilazione (metaprogrammazione modello)
Perché ho anche bisogno di attivare/disattivare altre specializzazioni template basate su altre caratteristiche, attualmente sto usando un modello con due parametri, e il secondo viene prodotto tramite std::enable_if
. Ecco quello che sto facendo attualmente:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
non ero in grado di fare qualcosa di simile, senza il modello exists
aiutante. Per esempio semplicemente facendo
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
non ha funzionato, perché in quei casi in cui deve essere utilizzato questa specializzazione, il caso di default non valido un'istanza invece.
Tuttavia non sono riuscito a trovare questo exists
in qualsiasi punto del nuovo standard C++ 11, che per quanto ne so sta prendendo semplicemente da boost::type_traits
per questo tipo di cose. Tuttavia su homepage per boost::type_traits
non viene mostrato alcun riferimento a qualcosa che potrebbe essere utilizzato al suo posto.
Manca questa funzionalità oppure ho trascurato qualche altro modo ovvio per ottenere il comportamento desiderato?
Dovresti forse pubblicare un link alle tue domande su come funziona. :) Inoltre, sembra che tu ti sia piaciuto molto, visto che lo hai suggerito più volte. – Xeo
@Xeo, sì, questo è piuttosto facile e diretto. Ma non ho la tua prima parte 'Dovresti forse postare un link alle tue domande su come funziona. :) ... intendi mentre rispondi devo inserire un link alle mie domande precedenti (invece del codice stesso)? Sospetto che non sia raccomandato su SO. – iammilind
Nono, volevo dire che pubblichi un link a [la tua domanda in cui hai chiesto come funziona] (http://stackoverflow.com/questions/6543652/different-template-syntax-for-finding-if-argument -is-a-class-or-not), dato che all'inizio non è così ovvio. Woops, e ho appena notato che ho scritto "domande", intendevo solo quella domanda, naturalmente. – Xeo