【问题标题】:How to determine which template will be used如何确定将使用哪个模板
【发布时间】:2019-10-21 17:42:33
【问题描述】:

我正在学习 c++ 中的模板,我找到了以下示例。

据我了解,如果没有匹配的非模板函数,编译器应始终尝试使用最“专业”的模板,但在此示例中,第一次调用导致调用函数 a(T*) 而不是一个(整数*)。为什么?为什么第二次调用会有所不同?

模板
void a(T) {cout 
void a(int*) {cout 
void a(T*) {cout 
无效 b(T) {cout 
无效 b(T*) {cout 
void b(int*) {cout 

结果输出是:

(T*)
(int)

我希望它是:

(int)
(int)

【问题讨论】:

标签: c++ templates


【解决方案1】:

只考虑主模板(因此不考虑特化)来选择更特化的重载。

使用主模板完成选择后,我们将使用专业化(如果有)。

现在template<> void a<>(int*);只能是template<typename T> void a(T)的特化(其他版本没见过)。

template<> void b<>(int*);template<typename T> void b(T*) 的特化(它是更特化的匹配重载)。

请注意,您可以通过提供模板而不是让编译器推断来选择 b 的特化:

  • template<> void b<>(int*) -> template<typename T> void b(T*) with T=int
  • template<> void b<int>(int*) -> template<typename T> void b(T*) with T=int
  • template<> void b<int*>(int*) -> template<typename T> void b(T) with T=int*

所以:

int i;
a(&i); // a<T*> with T=int*, no specialization for a<U*> (U=int) exist -> generic template called
b(&i); // b<T*> with T=int*, specialization for b<U*> (U=int) exists -> specialization called

【讨论】:

    【解决方案2】:

    由于声明顺序的不同,特化属于不同的主模板。

    对于第一种情况,专业化属于a(T)。对于第二种情况,专业化属于b(T*)。在主模板之间进行重载解析时,始终选择采用T* 的版本;那么在第一种情况下,将不考虑专业化,因为它不是a(T* 的专业化)。但它在第二种情况下被选中,因为b(T*) 具有专业化。

    第一种情况

    重载

    • a(T)
      • 专业化 --> a(int*)
    • a(T*) // 在重载决议中选择

    对于第二种情况

    重载

    • b(T)
    • b(T*) // 在重载决议中选择
      • specialization --> b(int*) // 然后选择专业化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2011-03-07
      • 2022-11-12
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多