在模板中,除了定义类型参数,我们还可以定义非类型参数。例如:
temlate<unsigned N, unsigned M> int foo(const char (&p1)[N], const char (&p2)[M]) { return strcmp(p1,p2); }
但是需要注意的是:编译器会在一个字符串字面常量的末尾插入一个空字符作为终结符。
例如我们调用
foo("hi", "mom");
实际上编译器会实例化如下版本
int foo(const char (p1)[3], const char (p2)[4]);
-----------
总结:在模板定义内,模板非类型参数是一个常量值。在需要常量表达式的地方,可以使用非类型参数,例如指定数组的大小等。