Domanda

Ho bisogno di memorizzare una serie di punti dati sotto forma di (nome, valore), in cui il valore potrebbe richiedere diversi tipi.

Sto cercando di utilizzare un modello di classe per ogni punto di dati.Quindi per ogni punto di dati vedo, voglio creare un nuovo oggetto e spingerlo di nuovo in un vettore.Per ogni nuovo tipo, ho bisogno di creare prima una nuova classe dal modello.Ma non posso memorizzare gli oggetti creati in qualsiasi vettore, dal momento che i vettori si aspettano lo stesso tipo per tutte le voci.I tipi che devo memorizzare non possono essere montati in una gerarchia di ereditarietà.Sono non correlati.Inoltre ci possono essere più tipi creati in futuro e non voglio cambiare il servizio di archiviazione per ogni nuovo tipo.C'è un modo per creare un contenitore eterogeneo per memorizzare queste voci? Grazie!

È stato utile?

Soluzione

La Biblioteca Boost ha probabilmente ciò che stai cercando (boost :: Qualsiasi).Puoi lanciare il tuo utilizzo di un approccio puntatore avvolto se non è possibile utilizzare Boost ...

Altri suggerimenti

boost::any è già stato consigliato, tuttavia è per qualsiasi cosa, quindi non puoi aspettarti molto da esso.

Se conosci i vari tipi in anticipo, stai meglio usando boost::variant.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}
.

Il problema con i contenitori come questo è che quando si desidera accedere a qualcosa nel contenitore, devi determinare il suo tipo e quindi gettarlo al tipo effettivo in qualche modo.Questo è brutto, inefficiente ed errori-prona, motivo per cui la scelta n. 1 in C ++ è usare l'ereditarietà, a meno che tu non abbia una ragione molto buona non - qualcosa che non ho mai effettivamente incontrato nella mia carriera C ++.

Stavo pensando di poter avere una coppia (tipo, void *) e scrivere la tua funzione POP che lancia il vuoto * a seconda del tipo descritto nella coppia e poi spinge questi in qualsiasi contenitore cattura il tuo occhio. .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top