前面的例子中,我們分別使用了類型和模板作為類模板的參數(shù)。除此之外,模板還支持非類型模板參數(shù)。
如下用數(shù)組實(shí)現(xiàn)Stack模板,第二個(gè)模板參數(shù)是一個(gè)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ù)指針)。到目前為止還不支持浮點(diǎn)數(shù),對于字符串常量也不支持,但是可以支持具有外部鏈接的字符串常量指針。
例如對于下面的模板定義:
template<const char* MyName>
struct Token
{
std::string name{MyName};
};
下面的用法都會(huì)產(chǎn)生編譯錯(cuò)誤:
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
的形式指示。