簡體   English   中英

將部分專用模板作為模板參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM