Vektor mit verschiedenen Typen?
-
Mahlzeit!
Ich habe folgende Struktur (Pseudocode):
struct Option<T> { Option(string optionName, T parameter) : optionName(s1), parameter(s2) { } string optionName; T parameter; Z.B.: Option<float> op("myfloatOption", 1.3f); float f = op.parameter;
Jetzt wuerde ich gerne Options verschiedener Typen (Option<int>, Option<float> etc.) in einen std::vector speichern. Geht das irendwie?
-
Gemeinsame Basisklasse, und dann als polymorphe Basisklassenzeiger abspeichern? Allerdings wäre dann vielleicht
boost::ptr_vector
geeigneter, weil der Speicher automatisch verwaltet wird.
-
std::vectorboost::any ?
-
Nexus schrieb:
Gemeinsame Basisklasse, und dann als polymorphe Basisklassenzeiger abspeichern? Allerdings wäre dann vielleicht
boost::ptr_vector
geeigneter, weil der Speicher automatisch verwaltet wird.Meinst du damit OptionInt : public Option, OptionFloat : public Option?
-
template <typename T> class Option : public OptionBase
-
Ist dann OptionBase ueberhaupt noch ein Template?
-
Nein.
-
Wie soll ich dann an den Parameter kommen? Die Basisklasse OptionBase muss ja irgend eine virtuelle Zugriffsmethode auf den generischen Parameter bieten.
-
Pfannkuchen! schrieb:
Wie soll ich dann an den Parameter kommen?
Gegenfrage: Mal angenommen, du könntest deine Parameter in einen vector ablegen ohne Basisklasse etc. - Wie denkst du würdest du an die Parameter kommen? C++ ist eine streng typisierte Sprache.
Pfannkuchen! schrieb:
Die Basisklasse OptionBase muss ja irgend eine virtuelle Zugriffsmethode auf den generischen Parameter bieten.
Du wirst nicht ohne eine Konvertierung herum kommen, oder du musst die Parameter nach Typ getrennt in unterschiedliche Kontainer schreiben.
-
Besteht die Möglichkeit, die Daten als String abzulegen oder muss es im Binärformat sein? Der Typ ist ja von OptionName abhängig, damit kannst du dann entsprechende Umwandlungen vornehmen. Ich habe eine Konfigurationsklasse, die sich etwa so bedienen lässt:
Configuration config; Xml_read_configuration( config, "c:\\config.xml" ); // 1. Parameter ist eine String Konstante, 2. Parameter ein Default Wert, falls // der Parameter nicht besetzt ist. int iVal = config.get_value<int>( INT_NAME_TAG, 0 ); bool bVal = config.get_value<bool>( BOOL_NAME_TAG, false ); double dVal = config.get_value<double>( DOUBLE_NAME_TAG, 100.0 );