《c++ templates》學習筆記(3)——第四章,非型別模板引數

weixin_34304013發表於2008-11-17
 

1       第四章 非型別模板引數

對於函式模板和類别範本,模板引數並不侷限於型別,普通值也可以作為模板引數。

1.1    非型別的類别範本引數

例如:

Template<typename T, int MAXSIZE>

Class Stack{

Private:

       T elems[MAXSIZE];

};

 

Int main()

{

       Stack<int, 20> int20Stack;

       Stack<int, 40> int40Stack;

};

每個模板例項都具有自己的型別,因此int20Stackint40Stack屬於不同的型別,而且這兩種型別之間也不存在顯示或者隱式的型別轉換;所以他們之間不能相互替換。

 

1.2    非型別的函式模板引數

template<typename T, int VAL>

T addValue(T const& x)

{

     return x+VAL;

}

std::vector<int> src;

     std::vector<int> dest;

     src.push_back(1);

     src.push_back(2);

     dest.resize(5);

     std::transform(src.begin(), src.end(), dest.begin(), addValue<int, 5>);//1

書上說最後一句要寫成:

     std::transform(src.begin(), src.end(), dest.begin(), (int(*)(int const&))addValue<int, 5>);//2

經過我在VS2005下驗證,直接寫成1的樣式就可以了。

1.3    非型別模板引數的限制

一般來說,非型別模板引數可以是常整數(包括列舉)或者指向外部連結物件的指標。

那麼就是說,浮點數是不行的,指向內部連結物件的指標是不行的。

那麼,什麼是指向內部連結物件的指標呢,下面給一個例子。

 

template<char const* name>

class MyClass{

     ...

};

 

MyClass<"hello"> x;

其中的hello就是一個內部連結物件,因為他是一個字面常量。字面常量都是內部連結物件。

 

如果改為:

extern char const s[] = "hello";

MyClass<s> x;

則是可以的。

相關文章