前面的例子中年枕,我們分別使用了類型和模板作為類模板的參數(shù)。除此之外伶跷,模板還支持非類型模板參數(shù)。
如下用數(shù)組實現(xiàn)Stack模板秘狞,第二個模板參數(shù)是一個int型常量叭莫,用于定義數(shù)組的最大長度。
template<typename T, int MAX_SIZE>
struct Stack
{
void push(const T&);
T pop();
private:
T elems[MAX_SIZE];
int size;
};
一般來說烁试,模板的非類型參數(shù)只能是整型常量(包括enum)雇初,或者指向外部鏈接的指針(包括函數(shù)指針,類的成員函數(shù)指針)减响。到目前為止還不支持浮點數(shù)靖诗,對于字符串常量也不支持,但是可以支持具有外部鏈接的字符串常量指針支示。
例如對于下面的模板定義:
template<const char* MyName>
struct Token
{
std::string name{MyName};
};
下面的用法都會產(chǎn)生編譯錯誤:
Token<“Hello”> tocken刊橘;
const char* str = "Hello";
Token<str> tocken;
而如下是可以正確編譯通過的:
extern const char str[] = "Hello";
Token<str> token;
std::cout << tocken.name << std::endl;
總結(jié)一下,模板的參數(shù)支持以下類型:
類型參數(shù)悼院;
使用typename或者class指示。非類型參數(shù)咒循;
整型常量(包括enum)据途,或者指向外部鏈接的指針(包括函數(shù)指針、類的成員函數(shù)指針叙甸,以及具有外部鏈接的字符串常量指針)颖医。模板參數(shù);
使用template<...> class XXX
的形式指示裆蒸。