C++ 模板 全特化与偏特化

2024-04-21 16:48
文章标签 模板 c++ 特化

本文主要是介绍C++ 模板 全特化与偏特化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++ 模板 全特化与偏特化

模板

模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

大白话:C++是一门强类型语言,编写一段通用的逻辑,可以把任意类型的变量传进去处理,通过把通用逻辑设计为模板,摆脱了类型的限制,极大地提升了代码的可重用性。

**模板实例化:**模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进 行编译。用户提供不同的类型参数,就会实例化出不同的代码。


类模板

类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。类模板尤其适用于描述通用但类型安全的数据结构。

类模板使用:

template <类型形式参数>class 类名{//类声明体;};template <类型形式参数>返回类型 类名 <类型> :: 成员函数名1(形式参数){//成员函数定义体;}... ...template <类型形式参数>返回类型 类名 <类型> :: 函数名N(形式参数){//成员函数定义体;}

案例:

#include <iostream>using namespace std;template<class T>
class Compare
{
public:bool equal(T a,T b);
};template<class T>
bool Compare<T>::equal(T a, T b)
{return a == b;
}int main()
{Compare<int>C;C.equal(1,2);return 0;
}

类模板全特化

所谓模板全特化限定死模板实现的具体类型;

比如上述这个例子,我们比较int类型这种还可以,但是比较float这种类型就不行,这时候就需要进行模板特化;

#include <iostream>using namespace std;template<class T>
class Compare
{
public:bool equal(T a,T b);
};template<class T>
bool Compare<T>::equal(T a, T b)
{return a == b;
}//模板全特化
template<>
class Compare<float>
{
public:bool equal(float a, float b);
};bool  Compare<float>::equal(float a, float b)
{return std::abs(a - b) < 10e-3;
}int main()
{Compare<int>C;cout<<C.equal(1,2)<<endl;Compare<float>C2;cout<<C2.equal(1.001,1.001)<<endl;return 0;
}

类模板偏特化

偏特化是指提供另一份template定义式,而其本身仍为templatized,这是针对于template参数更进一步的条件限制所设计出来的一个特化版本。也就是如果这个模板有多个类型,那么只限定其中的一部分;

#include <iostream>using namespace std;template<class T1,class T2>
class Test
{
public:Test(T1 a, T2 b):_a(a),_b(b){cout << "模板化" << endl;}
private:T1 _a;T2 _b;
};//模板全特化
template<>
class Test<int,int>
{
public:Test(int a, int b) :_a(a), _b(b){cout << "模板全特化" << endl;}
private:int _a;int _b;
};//模板偏特化
template<class T>
class Test<int,T>
{
public:Test(int a, T b) :_a(a), _b(b){cout << "模板偏特化" << endl;}
private:int _a;T _b;
};int main()
{Test<double, double> t1(1.01, 1.01);Test<int, int> t2(1, 1);Test<int, char*> t3(1, "111");return 0;
}

函数模板

函数模板一般定义:

template <类型形式参数>      //类型形式参数即此格式:<typename  形式参数>  或 <class 形式参数>
返回类型  函数名 (形式参数)
{//函数定义体;
}

案例:

#include <iostream>using namespace std;//普通模板
template<class T1,class T2>
bool Compare(T1 a, T2 b)
{return a == b;
}int main()
{cout << Compare(1, 2) << endl;return 0;
}

函数模板特化

函数模板特化和类模板特化本质是一样的,是对模板参数的特殊化处理:

#include <iostream>using namespace std;//普通模板
template<class T1,class T2>
bool Compare(T1 a, T2 b)
{cout << "普通模板" << endl;return a == b;
}//函数模板特化
template<>
bool Compare(const char* a, const char* b)
{cout << "函数模板特化" << endl;return strcmp(a,b) == 0;
}int main()
{cout << Compare(1, 2) << endl;cout << Compare("ab","ab") << endl;return 0;
}

总结

1、函数模板只有特化,没有偏特化;

2、模板、模板的特化和模板的偏特化都存在的情况下,编译器在编译阶段进行匹配,优先特殊的;

3、模板函数不能是虚函数;因为每个包含虚函数的类具有一个virtual table,包含该类的所有虚函数的地址,因此vtable的大小是确定的。模板只有被使用时才会被实例化,将其声明为虚函数会使vtable的大小不确定。所以,成员函数模板不能为虚函数。


这篇关于C++ 模板 全特化与偏特化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923567

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快