C++模板和特化

分类

C++的模板分为函数模板和类模板。
这是一个普通类模板:

// 主模板(通用版本)
template<typename T>
class MyContainer {
public:
    void print() { std::cout << "Generic\n"; }
};

这是一个普通函数模板:

// 主模板(通用版本)
template<typename T>
void print_type(T x) {
    std::cout << "Generic type\n";
}

按照模板定义,它表示针对类型T的操作。
注意:结构体做成的模板也是类模板;C++中类和结构体的唯一区别就是默认访问权限是private还是public。
 

特化

普通模板指的是:针对类型T的操作;
如果想要在T为特定类型时,有不同的操作,这就叫特化
T为具体类型时,此时的特化为全特化;T为指针或者引用时,此时的特化是偏特化
特化有固定的格式:
这是一个类模板针对的int的全特化:

template<>
class MyContainer<int> {
public:
    void print() { std::cout << "type int\n"; }
};

这是一个函数模板针对const char*的全特化:

// 特化:当 T = const char* 时
template<>
void print_type<const char*>(const char* x) {
    std::cout << "C-string: " << x << "\n";
}

这是一个类模板指针的偏特化:

// 偏特化:当 T 是指针类型时
template<typename T>
class MyContainer<T*> {
public:
    void print() { std::cout << "Specialized for pointer\n"; }
};

// 使用
MyContainer<int*> p; // 匹配偏特化

 

理解

  • 主模板相当于基类,特化相当于对基类的派生
  • template<>为主模板全特化的标志,而class A<T*>为主模板偏特化标志;它们格式固定,不会在普通模板中出现
  • 调用的时候,如果没有匹配到任何类型,就会使用主模板的默认定义 —— 这点和基类派生类一致
  • 全特化指的是特定的一个类型,比如int,float;偏特化反而指的是一类类型,比如指针,const;不要理解错了
     

适用场景

普通模板要处理的场景为:只有类型不同,实现完全相同的场景;
主模板和全特化要处理的场景是:不同类型的内部实现均不相同,具体到单个类型;
主模板和偏特化要处理的场景是:不同类型的内部实现均不相同,具体到一类类型。

posted @ 2025-10-20 11:17  moonのsun  阅读(12)  评论(0)    收藏  举报