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

有帮助吗?

解决方案

这是不可能的。如果您有一个以这种方式运行的模板,则它违反了 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 的定义不满足这些要求,则行为未定义。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top