下面的代码编译成功,我不明白为什么:
#include <stdio.h>
#include <vector>
#include <iostream>
// Template definition
template <typename T1, typename T2> class stack
{
};
// Template specialization
template <> class stack <float, float>
{
};
int main ()
{
stack <char, char> objStack;
return 0;
}
部分特化是否意味着我们可以将类用于我们在特化中指定的某些特定数据类型?
char 这里没有专门的类,如果它要用任何类型的数据类型编译,那么专门化的目的是什么?
最佳答案
模板特化适用于当您想要针对特定模板参数做一些特别不同的事情时。编译器将实例化原始模板中未指定的任何内容。
当您希望特定数据类型有不同的行为时,这很有用,但也可用于更复杂的模式匹配,例如更改指针类型或 const
类型的行为:
template <typename T>
struct is_pointer { static bool value = false; };
template <typename T>
struct is_pointer<T*> { static bool value = true; };
template <typename T>
struct is_const { static bool value = false; };
template <typename T>
struct is_const<const T> { static bool value = true; };
// later, try this:
assert(is_pointer<int*>::value == true);
assert(is_pointer<int>::value == false);
所以,长话短说:不要费心指定模板,除非您对某个参数有特殊要求,而您不能将其归纳到基本模板中。模板特化只是模式匹配的一种相当核心的形式,可用于善恶。
关于c++ - 类模板部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521470/