C++模版特化和偏特化

什么是模版特化

特化的含义:所谓特化,就是将泛型搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

函数模板的特化:当函数模板需要对某些类型进行特化处理,称为函数模板的特化。

类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

特化整体又分全特化与偏特化

全特化:全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。

偏特化:就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

模板函数只能全特化,没有偏特化(以后可能有)。

模板类是可以全特化和偏特化的。

全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义

偏特化的标志:template

怎么实现模版特化

这是一个函数模版

cpp 复制代码
template <class T>
int compare(const T &left, const T&right)
{
    std::cout <<"in template<class T>..." <<std::endl;
    return (left - right);
}

我们对这个模版函数进行特化

cpp 复制代码
template < >
int compare<const char*>(const char* left, const char* right)
{
    std::cout <<"in special template< >..." <<std::endl;

    return strcmp(left, right);
}
//第二种
template < >
int compare(const char* left, const char* right)
{
    std::cout <<"in special template< >..." <<std::endl;

    return strcmp(left, right);
}

函数模版特化的步骤:

必须要先有一个基础的函数模板

使用特换模板函数时格式有要求:

1、关键字template后面接一对空的尖括号<>

2、函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , ...) 在函数名后跟<>其中写要特化的类型

函数形参表必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

类模版特化步骤

类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

模板参数的类模板特化的几种类型

一是特化为绝对类型;

二是特化为引用,指针类型;

三是特化为另外一个类模板。

模版偏特化

模板偏特化是对模板的部分参数进行特化。它允许你针对模板参数的某些特定情况提供专门的实现,而不是完全特化所有的模板参数。

cpp 复制代码
   template <typename T1, typename T2>
   class MyClass {
   public:
       void print() {
           std::cout << "模板" << std::endl;
       }
   };

 template <typename T1>
   class MyClass<T1, int> {
   public:
       void print() {
           std::cout << "T2 的部分特化为 int" << std::endl;
       }
   };

模板特化和偏特化使得 C++模板更加灵活,可以根据不同的类型和特定情况提供定制化的实现。

相关推荐
安妮的小熊呢几秒前
CRMEB开源商城系统 & 标准版系统(PHP)开发规范
开发语言·javascript·php
子榆.6 分钟前
CANN ATC编译器:模型从Python到达芬奇指令走了多远
开发语言·python·neo4j
Dontla18 分钟前
Multi-Agent多智能体项目如何从MVP过渡到生产项目?
开发语言
兰令水25 分钟前
topcode【随机算法题】【2026.5.20打卡-java版本】
java·开发语言·算法
我还记得那天29 分钟前
C语言递归实现汉诺塔问题
c语言·开发语言
不吃土豆的马铃薯31 分钟前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
此生决int35 分钟前
算法从入门到精通——前缀和
c++·算法·蓝桥杯
凯瑟琳.奥古斯特40 分钟前
传输层核心功能解析
开发语言·网络·职场和发展
Fuyo_11191 小时前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|1 小时前
cmake:昇腾CANN构建系统完全指南
java·c++·算法