typedefing一个模板类型是否实例化它?

时间:2016-12-04 22:42:48

标签: c++ templates typedef

如果我使用typedef重命名模板类(或结构)的特化,那么它是否会在汇编代码中实例化该类型的模板?例如:

template<class T> struct Key
{
    float _time = 0.0f;
    T _value = T();
};
typedef Key<glm::vec3> VectorKey;
typedef Key<glm::quat> QuatKey;

这会在我的文件中创建Key<glm::vec3>Key<glm::quat>结构,以便我现在(基本上)

template<class T> struct Key
{
    float _time = 0.0f;
    T _value = T();
};
struct VectorKey
{
    float _time = 0.0f;
    glm::vec3 _value = glm::vec3();
};
struct QuatKey
{
    float _time = 0.0f;
    glm::quat _value = glm::quat();
};

我想知道在标题中包含typedef是不是一个坏主意,因为如果发生这种情况,那么包含此标题的任何文件都会包含更多不必要的代码。

1 个答案:

答案 0 :(得分:3)

不,typedef纯粹是语法上的。模板仅在实际使用时进行实例化。

根据C ++ 14标准(好吧,the November draft,因为我无法直接链接到ISO规范)(强调我的)

  

7.1.3 typedef说明符
  [...]
  使用typedef说明符声明的名称将成为 typedef-name 。在其声明的范围内, typedef-name 在语法上等同于关键字,并按照第8章中描述的方式命名与标识符关联的类型。 typedef-name 因此是另一种类型的同义词。 typedef-name 不会像类声明(9.1)或枚举声明那样引入新类型。

“实例化模板”一词与“引入新类型”的内容相同。

想象一下,在编译期间遇到的每个新类/类型定义都将它添加到“类型列表”中。每当遇到模板时,它都不会被添加到“list-of-types”中,直到实例化为止。