Ich habe die folgende Methode, die einen Vektor von C-Stil-Strukturen erhält und seine Elemente einzeln verarbeitet.Abrufen des Schablonentyps zur Laufzeit
Ich möchte es erweitern, um mehr Arten von Struktur zu erhalten, ohne meinen Code zu kopieren.
Da alle Arten von Strukturen dieselben Feldnamen enthalten, wäre es am elegantesten, diese neue Anforderung mithilfe von Vorlagen zu implementieren.
Allerdings kann ich nicht entscheiden, wie das zweite Argument an die write_db
Funktion übergeben werden; Dieses Argument, das eine Enum pro Strukturtyp ist — gibt es eine Option, um diese zur Laufzeit zu erwerben?
enum policy_types {
POLICY_TYPE_A,
POLICY_TYPE_B,
...
};
// old implementation - suitable for single struct only
int policyMgr::write_rule(std::vector <struct policy_type_a> & list) {
//conduct boring pre-write check
//...
for (auto & item : list) {
int ret = write_db(item.key1, POLICY_TYPE_A_ENUM, &item.blob);
}
//new implementation - suitable for multiple structs.
template <POLICY>
int policyMgr::write_rule(std::vector <POLICY> & list) {
for (auto & item : list) {
int ret = write_db(item.key1, type(POLICY) /* how can i get enum according to template type */, &item.blob);
}
Ich dachte über den ENUM-Wert als Konstante für jede Instanz von struct Zugabe, aber ich hoffe, einen besseren Ansatz zu finden, die nicht meine grundlegende Struktur Formatwechsel erfordern würde.
Ja, das ist die elegantere (und C++ - Standard-Bibliothek-ähnliche) Möglichkeit, dies zu tun: Im Gegensatz zu meiner Lösung verschmutzt es nicht die 'A'-Klasse. Plus eins. – Bathsheba
Ich würde den Namen "Typ" für ** Wert ** in Traits/Politik vermeiden. – Jarod42
aber das wird nicht zur Laufzeit funktionieren! Wenn der Vektor durch die Basis-Policy-Klasse spezialisiert ist und abgeleitete Policy-Subtypen enthält, erhält die Vorlage nur das Merkmal ihrer Vektor-Spezialisierung. – barney