IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> c++ 模板 特化与偏特化 -> 正文阅读

[数据结构与算法]c++ 模板 特化与偏特化

内容提炼

  • decltype(expression) 关键字:得出experssion的类型
  • typeid(variable) 返回variable的类型
  • auto + + ->decltype{} 自动推演返回值
  • 特化与偏特化

代码一(内置类型)typename

#include<iostream>
using namespace std;
//auto + <function> + ->decltype{} 自动推演返回值
template <typename T,typename U>
auto add(T a,U b)->decltype(a+b){
    return a + b;
}

//特化1:T和U都是位置的,但是针对泛型幽默中特征,(都是指针量输入)
template <typename T,typename U>
auto add(T* a,U* b)->decltype(*a+*b){
    return *a + *b;
}

//特化2: 全特化:针对某一个具体情况
template <>
int add(int a,int b){
    return a+b;
}

int main(){
    int a,b;
    double m,n;
    cout << "\033[33mplease input a(int),b(int),m(double),n(double) : \033[0m"<<endl;
    cin >> a >> b >> m >> n;
    cout << typeid(a+b).name() << endl;
    cout << "\033[32madd("<<a<<","<<b<<") = "<<add(a,b)<<"\033[0m"<<endl;

    cout << typeid(a+m).name() << endl;
    cout << "\033[32madd("<<a<<","<<m<<") = "<<add(a,m)<<"\033[0m"<<endl;

    cout << typeid(a+n).name() << endl;
    cout << "\033[32madd("<<a<<","<<n<<") = "<<add(a,n)<<"\033[0m"<<endl;

    int* x = &a,*y = &b;
    cout << typeid(*x+*y).name() << endl;
    cout << "\033[32madd("<<x<<","<<y<<") = "<<add(x,y)<<"\033[0m"<<endl;


    return 0;
}

结果为:

please input a(int),b(int),m(double),n(double) : 
3 5 7.8 3.4
i
add(3,5) = 8
d
add(3,7.8) = 10.8
d
add(3,3.4) = 6.4
i
add(0x7ffc93c9b080,0x7ffc93c9b084) = 8

代码二(自定义类型) class

#include "head.h"

using namespace std;

template <class T = double,class U = double> 
class Test{
public:
    Test(){
        cout << "normal template" << endl;
    }
};

template <class U> //偏特化
class Test<int,U>{
public:
    Test(){
        cout << "partial specialization template" << endl;
    }
};

template <> //特化
class Test<int,int>{
public:
    Test(){
        cout << "specialization template" << endl;
    }
};

int main(){
    Test<int,int> t1;
    Test<double,int> t2;
    Test<int,double> t3;
    Test<double,double> t4;
    Test<> t5; //T和U默认分别为double,double。
    return 0;
}

结果为:

specialization template
normal template
partial specialization template
normal template
normal template

注意点

内置类型的模板参数是作为函数体的类型参数去使用,它的特化在于对参数的具象化。
自定义类型的模板的偏特化就需要在调用它是做显示声名。在定义该模板类时也需要对特化的类型做

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:39:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:25:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码