2016-01-05 82 views
8

我有下面的方法獲取C風格結構的向量並一次處理其元素。在運行時獲取模板類型

我希望擴展它來接收更多類型的結構而不需要重複我的代碼。

由於所有類型的結構都將包含相同的字段名稱,因此使用模板實現此新需求將是最優雅的。

但是,我不能決定如何將第二個參數傳遞給write_db函數;該參數是一個枚舉類型爲—的枚舉是否有任何選項可以在運行時獲取?

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

我想過增加枚舉值的結構數據中每個實例作爲恆定的,但我希望能找到一個更好的辦法,也不會要求改變我的基本結構形式。

回答

10

如果您不想添加成員,則可以提供「特徵」類型。

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

是的,這是更優雅(和C++標準類庫)的方式來做到這一點:不像我的解決方案,它不污染'A'類。加一。 – Bathsheba

+0

我會避免特性/政策中**值**的名稱'type'。 – Jarod42

+0

但這不適用於運行時!如果矢量由基本策略類專門化並且包含派生的策略子類型...模板將只接收其矢量的特化的特徵 – barney

3

對每類是POLICY -able類型字段(如果你明白我的意思),其中foo是一個例子:

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

然後用write_db(item.key1, POLICY::type)適當。