2011-04-26 135 views
4

我有一個類模板,預計其他一些模板作爲一個參數:傳遞部分專用的模板作爲模板參數

template< 
    class Key, 
    template <typename K,template <typename T> class Allocator> class Policy 
> 
class container { 
    Policy<Key,Allocator>* _policy; 
    //some code here 
}; 

,通常我通過這樣的策略類使用它:

template <class Key,template <typename T> class Allocator> class policy { 
    //some code 
}; 

但如果我必須將其他模板參數傳遞給策略類,該怎麼辦?例如:

template <time_t Age,class Key,template <typename T> class Allocator> class policy_3 { 
    //some code 
}; 

我該怎麼做才能讓該課程的用戶在不接觸其他人的情況下通過年齡參數表?例如:

typedef container<key_type,policy_3<100500> > containerWithAge; 
+0

將模板更改爲簡單的'template '不是我假設的選項嗎? :P – Xeo 2011-04-26 07:03:16

回答

7

您有兩種選擇:綁定和重新綁定。

在綁定,你適應三元政策成二進制之一,預計將在模板的模板參數Policy

template <typename Key, template <typename T> class Allocator> 
struct policy_3_100500 : ternary_policy<100500,Key,Allocator> {}; 

,並使用policy_3_100500代替policy_3<100500>

要更接近您要拍攝的語法,你可以使用一個嵌套類:

template <time_t Age> 
struct policy_3 { 
    template <typename Key, template <typename T> class Allocator> 
    struct type : ternary_policy<Age,Key,Allocator> {}; 
}; 

,並使用policy_3<100500>::type代替policy_3<100500>

要準確獲得所需語法的唯一方法是使用該策略將::type移動到類中。這是第二種選擇:重新綁定(這也用於std :: allocator,順便說一句)。在這種情況下,您通過Policy作爲一個正常的模板參數,並承擔模板元函數,說bind,存在:

template <time_t Age> 
struct policy_3 { 
    template <typename Key, template <typename T> class Allocator> 
    struct bind : ternary_policy<Age,Key,Allocator> {}; 
}; 

而結構型相同,第二個選項,不同之處在於誰電話bind :在第一個選項(綁定)中,它是策略類的用戶(明確傳遞policy<100500>::type)。在這裏,它的使用策略類:

template <typename Key, typename Policy> 
struct container { 
    typename Policy::template bind<Key,std::allocator<Key>> * _policy; 
    // ... 
}: 

作爲一般的筆記,策略類,通常不爲模板,模板參數傳遞,但是作爲普通模板參數(正是因爲他們可能有不同數量的參數本身)。然後,使用該策略的類將假定某個內部結構(類型定義,函數,元函數,常量)出現在策略中,其中bind僅僅是一個示例。

+0

所以五年後,我遇到了完全相同的問題,並得出了與您相同的解決方案,但是我的代碼仍然沒有用期望的類模板進行編譯,得到了X :: type'。問題是我將'X :: type'作爲依賴參數傳遞給另一個模板,所以正確的語法是'X :: template type'。如果只有gcc會有更多有用的錯誤消息。 – 2016-09-15 07:06:06