Field
da solo non è un tipo, ma un modello che può generare una famiglia di tipi, ad esempio Field<int>
e Field<double>
. Tutti questi campi non sono correlati in modo tale che l'uno sia in qualche modo derivato dall'altro o così. Quindi devi stabilire una relazione tra tutti questi tipi generati. Un modo è quello di utilizzare un non-modello di classe base comune:
class FieldBase { };
template <typename T>
class Field : public FieldBase {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,FieldBase*> column;
};
E considerare l'utilizzo di puntatore intelligente al posto di tale puntatore grezzo nel codice. Ad ogni modo, ora il problema è che le informazioni sul tipo sono perse - se si punta a un Field<double>
oa un Field<int>
non è più noto e può essere rilevato solo mantenendo una sorta di flag di tipo nella base che è impostato dal modello classe derivata - o chiedendo RTTI utilizzando
dynamic_cast<Field<int>*>(field) != 0
Ma questo è brutto. Soprattutto perché quello che vuoi è un valore semantico. Io dovresti essere in grado di copiare la tua riga e copiare tutti i campi in essa contenuti. E si vorrebbe ottenere un doppio quando viene memorizzato un doppio - senza prima usare RTTI per accedere al tipo derivato.
Un modo per farlo è usare un sindacato discriminato. Questa è fondamentalmente un'unione per alcuni tipi arbitrari e in aggiunta un flag di tipo, che memorizza quale valore è attualmente memorizzato in quel campo (ad esempio se un double, int, ...). Ad esempio:
template <typename T>
class Field {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,
boost::variant< Field<int>, Field<double> > >
column;
};
boost :: variante fa tutto il lavoro per voi. Puoi usare visitation per farlo chiamare un functor usando il sovraccarico corretto.Date un'occhiata al suo manual
fonte
2009-02-20 10:58:24
Quindi qual è la domanda? –
non devi trasformare il tuo codice in html. basta metterlo così com'è, con una rientranza di 4 caratteri. –
a Dave: a Dave: La mia domanda è: Dal momento che il campo è un modello, come posso "dire" a std :: map che i valori sono "qualsiasi tipo di campo"? a litb: Grazie per il suggerimento! :-) – jbatista