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;
則是可以的。