template中传入具体类型而不是typename的用法

最常用的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[]数组了。

共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day