模板专业化示例

Template specialization example

据我了解,模板专业化的工作原理如下

template<typename T> 
void dummy(T a) { std::cout<<a<<std::endl; }

template<>
void dummy<int>(int a) { std::cout<<"special"<<std::endl; }

我在看下面的代码,它检查某物是否是一个指针:

template<typename T> 
struct is_ptr { 
  constexpr static bool value = false;
};

template <typename T>
struct is_ptr<T*> { 
  constexpr static bool value = true; 
};

这还是模板专业化吗?为什么行 template <typename T> 又出现在专业化中,而不是 <>。是不是因为只要我们有 T* 而不是 T,编译器就会生成多个特化?

此代码会扩展为

template<>
struct is_ptr<int*>
{
  constexpr static bool value = true;
};

?

你的第一个例子是function template specializationis_ptr 示例是 partial class template specialization

函数模板不能部分指定,class 模板可以。

class模板部分特化中template <typename T>的原因正是因为它部分特化在指针上,但是任何类型T.

在您的示例中,当使用 is_ptr<int*>::value 时,确实会选择部分专业化。