C++98(???不确定)标准规定可以使用整型类型(integral type),指针(pointer)或者引用(reference)绑定模板类或模板函数的非类型模板形参,实参(argument)必须是常量表达式(constant expression, constexpr)即在编译期能够确定变量值。
不能把普通的局部(栈上)对象或者动态(堆上)对象绑定指针或引用的非类型形参, 可以使用全局类型进行绑定;
关于类模板(class template)中非类型模板参数的写法,参见: http://en.cppreference.com/w/cpp/language/class_template
#include <iostream> #include <vector> #include <cstring> using namespace std;
//整型模板 template<unsigned N, unsigned M> bool compare(const char(&p1)[N], const char(&p2)[M]) { std::cout << "size : " << N << " " << M << std::endl; return strcmp(p1, p2); } //指针 template<const char* C> void pointerT(const char* str){ std::cout << C << " " << str << std::endl; } //引用 template<char(&ra)[9]> // 注:若类型不匹配编译会报错 void referenceT(const char* str){ std::cout << ra << " " << str << std::endl; } typedef void(*pfunc)(const char* c); void func(const char* c) { std::cout << c << std::endl; }
template<pfunc pf> void PointerF(char * str){ pf(str); }
char ca[] = "Caroline"; //初始化指针 char cr[9] = "Caroline"; //初始化引用, 包含一个结尾符号
int main(void) { if (compare("Caroline", "Wendy")) { std::cout << "Caroline is long." << std::endl; } else { std::cout << "Wendy is long." << std::endl; } char cb[] = "yanzheng\0"; //无法使用局部变量或者动态变量作为模板参数 pointerT<ca>("test0"); //指针 referenceT<cr>("test1"); //引用 PointerF<&func>("test2"); //函数指针 /* pointerT<cb>("test0"); //编译失败 */
getchar(); return 0; } /* output size : 9 6 Caroline is long. Caroline test0 Caroline test1 test2 */ |