[英]Passing partially specialized template as a template parameter
我有一個類模板,期望一些其他模板作為參數:
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
};
我該怎么辦,允許該類用戶通過Age paratemeter而不接觸其他人? 例如:
typedef container<key_type,policy_3<100500> > containerWithAge;
您有兩個選擇:綁定和重新綁定。
在綁定中,您可以根據模板模板參數Policy
預期將三元策略調整為二進制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,btw)。 在這種情況下,您將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;
// ...
}:
總的來說,Policy類通常不作為模板模板參數傳遞,而是作為普通的模板參數傳遞(正是因為它們本身可能有不同數量的參數)。 然后,使用策略的類假定在策略中存在某個內部結構(typedef,函數,元函數,常量),其中bind
只是一個示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.