2011-12-19 62 views
2
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的定義>什麼是行#1理解基於策略的模板

template <class> class OwnershipPolicy = RefCounted, 

語法,爲什麼它不提供參數,如下?

template <class T2> class OwnershipPolicy = RefCounted, 

Q2>之間有什麼#1#2不同?

template <class> class OwnershipPolicy = RefCounted, 

class ConversionPolicy = DisallowConversion, 

爲什麼其中一行有template<class>而另一行卻沒有?

回答

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 

值得注意的是,成語叫做「基於策略的設計」。