2016-01-05 15 views
8

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.

Antwort

10

Wenn Sie kein Mitglied hinzufügen möchten, können Sie einen "Merkmalstyp" angeben.

+0

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

+0

Ich würde den Namen "Typ" für ** Wert ** in Traits/Politik vermeiden. – Jarod42

+0

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

3

ein Typfeld auf jeder Klasse, die POLICY -able ist (wenn Sie meine Bedeutung bekommen), von denen foo ein Beispiel:

struct foo 
{ 
    /*your other bits*/ 
    static const policy_types type = POLICY_TYPE_whatever; /*older standards 
            might require definition in a source file */. 
}; 

Dann write_db(item.key1, POLICY::type) entsprechend verwenden.

Verwandte Themen