我有一个类模板,期望其他模板作为参数:
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;
答案 0 :(得分:8)
您有两种选择:绑定和重新绑定。
在绑定中,您可以将三元策略调整为二元策略,正如模板模板参数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
:在第一个选项(绑定)中,它是策略类的用户(通过传递{{ 1}}明确地)。在这里,它是使用政策的班级:
policy<100500>::type
作为一般说明,Policy类通常不作为模板模板参数传递,而是作为普通模板参数传递(正是因为它们本身可能有不同数量的参数)。然后,使用策略的类假定在策略中存在某个内部结构(typedef,函数,元函数,常量),其中template <typename Key, typename Policy>
struct container {
typename Policy::template bind<Key,std::allocator<Key>> * _policy;
// ...
}:
只是一个示例。