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++模板更加灵活,可以根据不同的类型和特定情况提供定制化的实现。

相关推荐
xuzhiqiang07247 小时前
Java进阶之路,Java程序员职业发展规划
java·开发语言
MediaTea7 小时前
Python:生成器表达式详解
开发语言·python
WW_千谷山4_sch8 小时前
洛谷B3688:[语言月赛202212]旋转排列(新解法:deque双端队列)
数据结构·c++·算法
漂流瓶jz8 小时前
UVA-11214 守卫棋盘 题解答案代码 算法竞赛入门经典第二版
c++·算法·dfs·aoapc·算法竞赛入门经典·迭代加深搜索·八皇后
fpcc9 小时前
并行编程实战——CUDA编程的Enhancing Memory Allocation
c++·cuda
overmind9 小时前
oeasy Python 115 列表弹栈用pop删除指定索引
开发语言·python
白太岁9 小时前
通信:(3) 高并发网络通信:epoll + 边沿触发 + 非阻塞 IO + tcp
c语言·网络·c++·网络协议·tcp/ip
Never_Satisfied9 小时前
在c#中,使用windows自带功能将文件夹打包为ZIP
开发语言·windows·c#
楼田莉子10 小时前
C++项目:日志&&线程池
linux·c++·学习·visual studio code
hnxaoli10 小时前
win10程序(十六)通达信参数清洗器
开发语言·python·小程序·股票·炒股