在使用模板时我发现了一些有趣的东西(我还在学习c ++,所以希望我没有拙劣这个示例代码):
template <class T>
T Pyramid<T>::getValue(int row, int col) {
return data[triangleNum[row] + col];
}
为什么我们手动指定T
参数(因为它在此函数中命名)为class
?不明显T
会成为一个类,还是这意味着我们可以允许在模板中使用其他数据类型?
因此,如果我们要从头开始重新创建数组,我们可以做这样的事情,如果是这样,那么允许哪些数据类型,以及对此有什么限制?
# template <class T, int length>
CustomArray<float, 365> dailyIncome;
答案 0 :(得分:0)
大致上有两类模板参数。
template<typename T>
(这比将参数T
标记为class
或struct
或union
更为通用,因为它还可以包含原语类似int
,bool
等类型。)
积分常数,即template<int i>
。例如,以下结构在某些TMP技术中很有用。
template<int k> struct Rank : Rank<k-1> {};
template<> struct Rank<0> {};
此模板生成Rank
类型的层次结构,每个类型都相互继承,即Rank<0>
是Rank<1>
的超类,是Rank<2>
的超类... < / p>
积分常数可以广义地解释为包括char
,还包括像int *
这样的指针,甚至是指向某个结构的指针。例如,您可以针对指向某个内存中某种类型的结构的某个固定(静态存储持续时间)实例的指针来模拟一个类,这可能很有用。
您无法使用ctor或dtor对任何内容进行模板处理(何时运行?)。您无法对const char *
字符串文字进行模板化 - 如果您尝试实例化类型my_type<"foo">
,则永远无法再次引用该类型,因为当您稍后键入my_type<"foo">
时获取不同的字符串文字"foo"
,因此获得不同的指针和不同的类型。 (但是,您可以针对具有静态存储持续时间的特定字符串进行模板化。)您也无法对浮动模板进行模板化,因为您可能希望my_type<2.0/3>
和my_type<6.0/9>
之类的内容始终给出你是同一类型的,然后得到浮点舍入造成的粗鲁惊喜。
您也可以针对功能指针进行模板设置,有时也非常有用。
指针到成员函数的模板化也是可能的,我在过去制作一些将C ++类绑定到lua的代码时使用过它。
这里是C ++ 11标准(14.1.4)的实际文本
非类型模板参数应具有以下(可选的cv限定)类型之一:
(4.1) - 整数或枚举类型,
(4.2) - 指向对象或指向函数的指针,
(4.3) - 对对象的左值引用或对函数的左值引用,
(4.4) - 指向成员的指针,
(4.5) - std :: nullptr_t。
[注意:其他类型不得明确地在下面或通过管理形式的规则隐式地被禁止 模板参数(14.3)。 - 结束注释]模板参数的顶级cv限定符将被忽略 在确定其类型时。
实际上我并不知道左值引用,我从来没有真正使用过它,除了指向成员函数的指针之外我也没有使用指向成员的指针。我反对nullptr
,这有时也很有用。