理解基于策略的模板的定义

时间:2011-12-19 22:19:00

标签: c++ templates

template <
    typename T,
    template <class> class OwnershipPolicy = RefCounted, #1
    class ConversionPolicy = DisallowConversion,         #2
    template <class> class CheckingPolicy = AssertCheck,
    template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;

Q1 &GT;第#1行的语法是什么

template <class> class OwnershipPolicy = RefCounted,

为什么它不提供如下参数?

template <class T2> class OwnershipPolicy = RefCounted,

Q2 &GT; #1 #2 之间有什么区别?

template <class> class OwnershipPolicy = RefCounted,

class ConversionPolicy = DisallowConversion,

为什么其中一行有template<class>而另一行没有?

1 个答案:

答案 0 :(得分:4)

template <class> class OwnershipPolicy是模板模板参数。即OwnershipPolicy应该是采用一个(且只有一个)类型参数的模板。这个论点没有名字,因为它不需要,而且无论如何你也无法用它。

class ConversionPolicy相当于typename ConversionPolicy,即任何普通类型参数。

不同之处在于你如何使用它。对于模板模板参数,您只提供模板的名称,稍后可以使用该名称来实例化具体类型。对于typename,您需要一个具体的类型:

template <typename A, template <typename> class B>
struct foo {};

template <typename T>
struct x {};

struct y {};

template <typename T, typename U>
struct z {};

// both of these are valid:
foo<x<int>, x> a;
foo<y, x> b;
// these are not:
foo<y, x<int>> c;
foo<y, y> d;
foo<y, z> e; // z has two template arguments, B must have only one

值得注意的是,这个成语被称为“基于政策的设计”。