您可以使用哪些数据类型的模板?

时间:2015-08-24 02:37:44

标签: c++ templates

在使用模板时我发现了一些有趣的东西(我还在学习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;

1 个答案:

答案 0 :(得分:0)

大致上有两类模板参数。

  1. template<typename T>(这比将参数T标记为classstructunion更为通用,因为它还可以包含原语类似intbool等类型。)

  2. 积分常数,即template<int i>。例如,以下结构在某些TMP技术中很有用。

  3. 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,这有时也很有用。