【问题标题】:What data types can you use with a template? [duplicate]模板可以使用哪些数据类型? [复制]
【发布时间】:2015-11-17 08:56:09
【问题描述】:

在使用模板时我注意到了一些有趣的事情(我还在学习 c++,所以希望我没有搞砸这个示例代码):

template <class T>
T Pyramid<T>::getValue(int row, int col) {
    return data[triangleNum[row] + col];
}

为什么我们手动将T 参数(在此函数中命名)指定为classT 将成为一个类不是很明显吗,或者这是否意味着我们可以允许在模板中使用其他数据类型?

那么,如果我们要从头开始重新创建数组,我们可以这样做吗?如果可以,允许哪些数据类型,以及对此有何限制?

# template <class T, int length>
CustomArray<float, 365> dailyIncome;

【问题讨论】:

  • @user657267 这是相关的,因为现在我知道typename 是另一个可能的值,但仍然没有回答有关其他数据类型的问题,例如在我的示例中,int
  • 答案是class 在这种情况下并不意味着class,它只是重新用于模板(在引入typename 关键字之前)。
  • IQAndreas:您可能想查看std::array 中与您的CustomArray 相距不远的标准中的示例

标签: c++ templates


【解决方案1】:

模板参数大致分为两类。

  1. template&lt;typename T&gt;(这比将参数T 标记为classstructunion 更通用,因为它还可以包括基本类型,如intbool、等等)

  2. 整数常量,即template&lt;int i&gt;。例如,以下构造在某些 TMP 技术中很有用。

template<int k> struct Rank : Rank<k-1> {};
template<> struct Rank<0> {};

此模板生成Rank 类型的层次结构,每个类型相互继承,即Rank&lt;0&gt;Rank&lt;1&gt; 的超类@ 是Rank&lt;2&gt; 的超类...

整体常量可以广义地解释为包括char,也包括像int * 这样的指针,甚至是指向某个结构的指针。例如,您可以针对指向某个固定(静态存储持续时间)内存中某个类型的结构实例的指针模板类,这可能很有用。

您不能使用 ctor 或 dtor 对任何东西进行模板化(它们什么时候运行?)。您不能针对const char * 字符串文字进行模板化——如果您尝试实例化类型my_type&lt;"foo"&gt;,您将永远无法再次引用该类型,因为当您稍后输入my_type&lt;"foo"&gt; 时,您会得到不同的字符串文字@ 987654339@,因此是不同的指针和不同的类型。 (但是,您可以针对特定字符串进行模板具有静态存储持续时间。)您也不能针对浮动进行模板,因为您可能期望像 my_type&lt;2.0/3&gt;my_type&lt;6.0/9&gt; 这样的东西总是给您相同的类型,然后得到一个由浮点舍入引起的粗鲁的惊喜。

您还可以针对函数指针进行模板化,这有时也非常有用。

指针到成员函数模板也是可能的,我过去在编写一些将 C++ 类绑定到 lua 的代码时使用过它。

这是 C++11 标准 (14.1.4) 的实际文本

非类型模板参数应具有以下类型之一(可选 cv 限定):

(4.1) — 整数或枚举类型,

(4.2) — 指向对象的指针或指向函数的指针,

(4.3) — 对对象的左值引用或对函数的左值引用,

(4.4) — 指向成员的指针,

(4.5) — std::nullptr_t.

[ 注意:其他类型要么在下面明确地被禁止,要么被管理形式的规则隐含地禁止 模板参数(14.3)。 — end note ] 模板参数上的顶级 cv 限定符被忽略 在确定其类型时。

其实我不知道左值引用,我从来没有真正使用过,除了指向成员函数的指针之外,我也没有使用指向成员的指针。我已经针对nullptr 进行了模板化,这有时也很有用。

【讨论】:

  • 您可以有一个const char* 模板参数。您不能将字符串文字用作此类参数的参数。 [temp.arg.nontype]/2
  • 谢谢,我实际上并没有意识到这一点。编辑
  • 这里没有提到模板模板参数。
  • Yakk:我读到这个问题专门询问“非类型模板参数”,这就是我在问题中读到“数据类型”这个词的方式。如果您想添加有关模板模板参数信息的另一个答案,请成为我的客人
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多