【问题标题】:What's the point of template specialization in C++ if you can do the same without templates? [closed]如果您可以在没有模板的情况下做同样的事情,那么 C++ 中的模板专业化有什么意义? [关闭]
【发布时间】:2020-09-25 16:29:28
【问题描述】:

这是一个简单的例子:

#include <iostream>

template <class T>
void print(T in){ 
  printf("NOT printing int\n"); 
}

template <> // <-- template specialization
void print<int>(int in){ 
  printf("printing int\n"); 
}

int main(){
 print(5); // printing int
 return 0;
}

但是int 版本可以不用模板就可以写出来,像这样:

void print(int in){ 
  printf("printing int\n"); 
}

那么这里的模板特化有什么意义呢?

编辑(可能需要的示例)

#include <iostream>

template <class T>
void print(){ 
  printf("printing float\n"); 
}

template <> 
void print<int>(){ 
  printf("printing int\n"); 
}

int main(){
 print<float>();
 return 0;
}

【问题讨论】:

  • 想想返回值。
  • 对于函数,重载通常比专业化更受欢迎。但也有针对类的专业化(例如特征)。
  • 我不确定你的问题是什么。假设模板特化在这种特殊情况下没有用。它在其他地方仍然有用。
  • 这样的模板仍然可以方便地用于其他只传递类型参数的模板。
  • 你能举个其他地方的例子吗?

标签: c++


【解决方案1】:

关键是你不能用重载做所有事情。例如,考虑一个没有参数的情况:

template<class T>
void foo();

没有办法重载这个函数,因为没有参数。但它可以通过显式实例化来调用:

foo<int>();

而且这些实例化可以被特化。

还有类模板特化,当然不能使用函数重载来完成。


重载可以做什么和模板专业化可以做什么之间有一些重叠。当它是一个选项时,通常认为使用重载会更好。

【讨论】:

  • std::type_identity&lt;T&gt; 可以作为标签来允许有参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2011-12-07
  • 2011-04-11
相关资源
最近更新 更多