2016-01-05 13 views
8

Mam następującą metodę, która pobiera wektor struktur w stylu C i przetwarza swoje elementy pojedynczo.Uzyskiwanie typu szablonu w czasie wykonywania

Chciałbym go rozszerzyć, aby otrzymywać więcej rodzajów struktur bez powielania mojego kodu.

Ponieważ wszystkie typy struktur będą zawierały te same nazwy pól, byłoby najbardziej elegancko zastosować to nowe wymaganie przy użyciu szablonów.

Jednak nie mogę zdecydować, jak przekazać drugi argument do funkcji write_db; ten argument, który jest typu enum per struct —, czy istnieje opcja uzyskania tego w czasie wykonywania?

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); 
} 

myślałem o dodanie wartość enum jako stały dla każdej instancji struct ale mam nadzieję znaleźć lepsze podejście, które nie wymagałoby zmiany mojego podstawowy format struct.

Odpowiedz

10

Jeśli nie chcesz dodawać członka, możesz podać typ "cech".

template<typename P> 
struct PolicyTraits {}; 

template<> 
struct PolicyTraits<policy_type_a> 
{ 
    static enum { Type = POLICY_TYPE_A }; 
}; 

template<> 
struct PolicyTraits<policy_type_b> 
{ 
    static enum { Type = POLICY_TYPE_B }; 
}; 

template <typename A> 
int policyMgr::write_rule(const std::vector<A> & list) { 
    for (const auto & item : list) { 
     int ret = write_db(item.key1, PolicyTraits<A>::Type, &item.blob); 
    } 
} 
+0

Tak, to jest bardziej elegancka (i standardowa biblioteka w stylu C++), aby to zrobić: w przeciwieństwie do mojego rozwiązania nie zanieczyszcza klasy 'A'. Plus jeden. – Bathsheba

+0

Unikałbym nazwy "typ" dla ** wartości ** w cechach/polisie. – Jarod42

+0

ale to nie zadziała dla środowiska wykonawczego! jeśli wektor jest wyspecjalizowany przez podstawową klasę polityki i zawiera podtypy polityk pochodnych ... szablon otrzyma tylko cechę specjalizacji tego wektora: – barney

3

mieć pole typu na każdej klasie, która jest POLICY -able (jeśli uzyska co mi chodzi), z których foo przykład:

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

Następnie użyj write_db(item.key1, POLICY::type) jako właściwe.