c++ - 类模板部分特化

标签 c++ templates template-specialization

下面的代码编译成功,我不明白为什么:

#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/

相关文章:

c++ - 如何判断 "->"运算符最终是否返回类型?

c++ - 通过类模板特化访问成员数据

C++:避免​​重复符号链接(symbolic link)器错误

c++ - 使用 g++ 编译 - 包括头文件

c++ - 有了模板,如何区分两种并列的情况,比如浮点型和整数型?

c++可扩展的lambda函数分组在任意数量的 block 中

c++11 - 检测两种类型是否是同一类模板的特化?

c++ - 部署不起作用且可执行扩展

templates - 如何在没有 Extbase 的情况下渲染 Fuid View 模板?即 eID 的电子邮件模板

c++ - 链接器可以区分模板函数和非模板函数吗?