c++ - 模板特化示例

标签 c++ c++11 templates template-specialization

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

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

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

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

在您的示例中使用 is_ptr<int*>::value 时,确实会选择偏特化。

关于c++ - 模板特化示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675643/

相关文章:

C++ - 无法查看使用 WinObj 创建的互斥体

c++ - 为什么 unique_ptr 不能推断删除器的类型?

c++ - 如何使 C++ 链接占用更少的内存

c++ - MongoDB C++ 驱动程序 3.0 以字符串形式获取文档并避免使用 json

c++ - 如何检查分配给调用运算符结果的类型?

c++ - 用 alsa 录制 8 位有符号单声道 16khz 声音的最简单方法(在某种程度上它与脉冲兼容)?

C++ Builder 导出 cdecl 以供跨平台使用

c++ - 模板实例化错误,MSVC 与 GCC

c++ - glScalef 命令偏离中心

c++ - 我可以在模板参数中声明一个 constexpr lambda 吗?