除了定义类型参数,还可以定义非类型参数(nontype parameter)。非类型参数表示一个值而非一个类型。
模板被实例化时,非类型参数被一个用户提供的或编译器推断出的值所代替。这些值必须是常量表达式,从而允许编译器在编译时实例化模板。
template<unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
return strcmp(p1, p2);
}
处理两个字符数组,两个非类型模板参数是unsigned int值,该值在调用时确定,可以由程序员显式指定,也可以隐式推断。
compare("hi", "mom");
//编译器会用字面常量的大小来代替N和M,从而实例化模板。
// int compare(const char (&p1)[3], const char (&p2)[4])
非类型参数可以是一个整型,或是一个指向对象或函数类型的指针或左值引用。
绑定到非类型整型参数的实参必须是一个常量表达式。绑定到指针或引用非类型参数的实参必须具有静态的生存期。不能用一个普通局部变量或动态对象作为指针或引用非类型模板参数的实参。指针参数可以用nullptr或一个值为0的常量表达式来实例化。
模板定义内,模板非类型参数是一个常量值。在需要常量表达式的地方,可以使用非类型参数,例如,指定数组大小。
No comments:
Post a Comment