1 第四章 非型別模板引數
對於函式模板和類别範本,模板引數並不侷限於型別,普通值也可以作為模板引數。
1.1 非型別的類别範本引數
例如:
Template<typename T, int MAXSIZE>
Class Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack<int, 20> int20Stack;
Stack<int, 40> int40Stack;
…
};
每個模板例項都具有自己的型別,因此int20Stack和int40Stack屬於不同的型別,而且這兩種型別之間也不存在顯示或者隱式的型別轉換;所以他們之間不能相互替換。
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;
則是可以的。