Tipologie di modelli – Qual è il tuo lavoro in giro?

C ++ 0x ha alias modello (a volte indicato come typedefs modello). Vedi qui Le specifiche attuali del C ++ no.

Cosa ti piace usare come lavoro? Oggetti contenitore o macro? Senti che ne vale la pena?

Cosa ti piace usare come lavoro? Oggetti contenitore o macro? Senti che ne vale la pena?

Il modo canonico è usare una metafunzione come questa:

template  struct my_string_map { typedef std::map type; }; // Invoke: my_string_map::type my_str_int_map; 

Questo è anche usato in STL ( allocator::rebind ) e in molte librerie incluso Boost. Lo usiamo ampiamente in una biblioteca bioinformatica .

È gonfio, ma è la migliore alternativa il 99% delle volte. L’utilizzo di macro qui non vale i molti aspetti negativi.

(EDIT: ho modificato il codice per riflettere le convenzioni Boost / STL come indicato da Daniel nel suo commento).

 template  struct my_string_map : public std::map { }; 

Non si dovrebbe ereditare da classi che non hanno un distruttore virtuale. È legato ai distruttori nelle classi derivate che non vengono chiamati quando dovrebbero essere e si potrebbe finire con la memoria non allocata.

Detto questo potresti ***** probabilmente ***** farla franca nell’istanza sopra perché non stai aggiungendo altri dati al tuo tipo derivato. Si noti che questo non è un avallo. Consiglio ancora che tu non lo faccia. Il fatto che tu possa farlo non significa che dovresti .

EDIT: Sì, questa è una risposta al post di ShaChris23. Probabilmente mi sono perso qualcosa perché è apparso sopra il suo messaggio anziché sotto.

A volte puoi semplicemente scrivere esplicitamente i typedef non contemplati per tutti i tipi necessari. Se la class base è basata su più template args con un solo tipo desiderato per essere digitato, è ansible ereditare una class specializzata con typedef effettivamente incluso nel nome della class ereditata. Questo approccio è meno astruso rispetto all’approccio metafunction.