Classi nidificate vs namespace

1

È bello usare le classi annidate o dovrei usare invece i namespace?

Nel contesto:

Dispongo di un caricatore di codec basato su modelli e di un codec In objects and Out objects

template<class TypeOfData>
class Codec
    {
    private:
        typename TypeOfData::In* reader;
        typename TypeOfData::Out* writer;
    };

D'altra parte, non posso usare

using TypeOfData;

se non voglio: il mio modo di usare un metodo statico.

    
posta user877329 20.04.2013 - 15:12
fonte

1 risposta

1

Personalmente, mi piace questo approccio, perché:

  • È un modo per standardizzare le definizioni del tipo di classe. Se lo desideri, puoi vederlo come una sorta di definizione di interfaccia per i tipi da utilizzare per l'istanziazione del modello, perché non puoi creare un'istanza di questo modello con tipi arbitrari (per la variabile di tipo 'TypeOfData'). Invece, un concreto 'TypeOfData' deve definire una definizione di tipo 'In' e 'Out' interna.
  • Evita di scrivere un modello che richiede tre variabili di tipo (in questo caso concreto) - qualcosa come

    template <class TypeOfData, class TypeOfIn, class TypeOfOut>
    class Codec
    {
    private:
        TypeOfIn* reader;
        TypeOfOut* writer;
    };
    

    che rende l'istanziazione di questo modello più complesso. Inoltre, puoi passare qualsiasi tipo per "TypeOfIn" e "TypeOfOut". Mentre questo è più generico, potrebbe non essere l'intenzione dell'autore del modello. In questo caso concreto puoi vedere che ci deve essere esattamente un tipo "In" e uno "Out" associati a una classe "TypeOfData", che è definita da "TypeOfData" stesso. L'uso di un modello con tre variabili di tipo non ti dice nulla su questi vincoli. Inoltre, il template instantiator (codice client) avrebbe dovuto sapere quali "TypeOfIn" e "TypeOfOut" dovevano usare con una classe "TypeOfData". E questo causerà problemi se, a volte in futuro, i tipi associati "TypeOfIn" e "TypeOfOut" da utilizzare con la modifica "TypeOfData". Usando la versione dell'OP, il codice cliente probabilmente non dovrebbe cambiare, perché il modello ottiene i tipi corretti da usare da "TypeOfData" e non dal codice client.

Quindi penso che l'utilizzo di questo approccio sia buono se questi argomenti corrispondono ai tuoi requisiti. A proposito, in tal caso non mi dispiacerebbe essere costretto "to :: my way to static method" (o tipo definizioni). Se non lo fanno, tuttavia, potrebbe essere meglio utilizzare un altro approccio e trarre profitto da una soluzione probabilmente più generica (modello).

    
risposta data 30.04.2013 - 23:51
fonte

Leggi altre domande sui tag