如果我使用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
是不是一个坏主意,因为如果发生这种情况,那么包含此标题的任何文件都会包含更多不必要的代码。
答案 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”中,直到实例化为止。