C++ - 函数模板专业化的目的是什么?什么时候用?

Shr*_*ers 5 c++ templates

学习C++,发现了功能模板.本章提到了模板专业化.

  1. template <> void foo<int>(int);

  2. void foo( int );

为什么专注于你可以使用第二个?我认为模板可以概括.当你可以使用常规函数时,为特定数据类型专门化一个函数有什么意义?

显然,模板专业化存在是有原因的.什么时候应该使用?我读过Sutter的"为什么不专攻......"一文,但我需要更多的外行人版本,因为我只是在学习这些东西.

Dav*_*eas 12

主要区别在于,在第一种情况下,您为编译器提供了特定类型的实现,而在第二种情况下,您提供了一个不相关的非模板化函数.

如果总是让编译器推断出类型,编译器会优先使用非模板化函数,编译器将调用自由函数而不是模板,因此提供与参数匹配的非模板化函数将具有在大多数情况下,专业化效果相同.

另一方面,如果在任何地方你提供了模板参数(而不是让编译器推断),那么它只会调用通用模板并可能产生意想不到的结果:

template <typename T> void f(T) { 
   std::cout << "generic" << std::endl; 
}
void f(int) { 
   std::cout << "f(int)" << std::endl; 
}
int main() {
   int x = 0;
   double d = 0.0;
   f(d); // generic
   f(x); // f(int)
   f<int>(x); // generic !! maybe not what you want
   f<int>(d); // generic (same as above)
}
Run Code Online (Sandbox Code Playgroud)

如果您已为int模板提供了特殊化,则最后两个调用将调用该特化而不是通用模板.