6

是否可以在 C++ 中编写不纯的模板?也就是说,一个模板有时会为相同的模板参数提供不同的结果类型或 int。例如,是否可以编写一个模板,有时在Foo<T>哪里Foo<int>::type,有时char在哪里floatFoo<T>或者Foo<double>::my_static_const_int有时是 10 有时是 20的模板?

4

1 回答 1

10

这是不可能的。如果您有一个以这种方式运行的模板,则它违反了 ODR 和/或其他规则,例如应在实例化之前声明特化。因此,您不能只放置一个会以某种方式更改 typedef 成员以使其解析为所有后续引用的不同类型的特化。

请记住,Foo<T>如果Foo是类模板,则引用类。如果类的 typedef 成员在程序中的某一点被定义为一种类型,而在另一点被定义为另一种类型,那么一定是出了问题。以下是与此有关的各种标准报价


函数模板、成员函数模板或类模板的成员函数或静态数据成员的特化可以在翻译单元内具有多个实例化点。类模板的特化在翻译单元内最多有一个实例化点。任何模板的特化都可能在多个翻译单元中具有实例化点。如果根据一个定义规则(3.2),两个不同的实例化点赋予模板特化不同的含义,则程序是非良构的,不需要诊断。


如果模板、成员模板或类模板的成员是显式特化的,则应在第一次使用该特化之前声明该特化,这将导致发生隐式实例化,在每个翻译单元中出现这种使用; 不需要诊断。


(各种“噪音”略过)

[..可以在整个程序中定义多个的各种实体..]。给定这样一个名为 D 的实体在多个翻译单元中定义,则

  • D 的每个定义都应由相同的记号序列组成;
  • 在 D 的每个定义中,根据 3.4 查找的对应名称应指在 D 的定义中定义的实体,或应指同一实体,在重载决议 (13.3) 和部分模板特化 (14.8) 匹配之后.3)...
  • 如果 D 是一个模板,并且在多个翻译单元中定义,那么上面列表中的最后四个要求应适用于模板定义 (14.6.3) 中使用的模板封闭范围的名称,也适用于依赖名称在实例化点(14.6.2)。如果 D 的定义满足所有这些要求,那么程序的行为就好像有一个 D 的定义。如果 D 的定义不满足这些要求,那么行为是未定义的。
于 2009-07-29T00:33:33.887 回答