最常用的template,往往是像以下类型的:
template <typename T>
void Func(T a) ...
在编译的时候,会针对传入的类型生成特定的该类型的函数,于是该template函数就生成了。可见传入的T虽然不定,但是编译器其实已经是已经确定的类型,也就是有N个T,就会生成N个由该模板生成的函数。
然后template的<>中还可以传入某些值类型,而不是type类型,比如以下的定义:
template <int _Size>
而对于这种情况,规则其实是和上述的typename是一致的,即传入的int值应当是一个常量,不然无法针对该值来生成特定的模板函数。下面来看一个利用该特性的例子,利用该特性可以把数组的引用传入参数,那样不用以void*和size_t的形式来传入数组了,那样会简明很多:
template <int _Size>
void PassArrayRef(char (&refArray) [_Size])
{
printf("size of array : %d \n", _Size);
}
void TestArrayRef()
{
char szBuf[123] = {0};
PassArrayRef(szBuf);
printf("%d\n", szBuf10[0]);
}
在上述的例子中,我们在TestArrayRef
函数中,将szBuf传入了PassArrayRef
函数,那么会针对char[123]来生成特定的模板函数,即_Size = 123
,也就是_Size
是一个常量,如此情况下,我们就可以利用这个特性来方便的引用char[]数组了。