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++template模板的使用(中) -> 正文阅读

[C++知识库]C++template模板的使用(中)

template模板详解第二集

软件操作系统标准
visual stdio Codewin11C++11

获取代码资源点击这里或加Q群:928357277一起学习,博主期待你们的到来

使用头文件: #include <iostream>
G++编译方式: g++ -std=c++11 .\main.cpp //在终端用C++11标准编译

模板用法1:默认参数及其推导

//函数模板带默认参数仅不支持C++98的模板特性,C++11之后的函数模板也不需要遵循从右往左的指定规则
//如template<typename T = int,typename X>也被视为正确
template<typename T ,typename X = char>
void defaultParameter( T a = 0 ,X x =0) //模板函数带默认参数
{
    std::cout<<"a = "<<a <<std::endl;
    std::cout<<"x = "<<x <<std::endl;
}
void printDefaultParameter() //推导过程
{
    //defaultParameter(); 错误推导
    defaultParameter(4);//打印 4,0
    defaultParameter(5,'l');//打印 5,'1'
}

int main()
{
	printDefaultParameter();//执行
	reuturn 1;
}

模板用法2:外部模板的声明及其实例化

提示:外部模板的声明在过程上同普通外部变量声明除了语法上的差别,基本一致

/*
普通变量声明
extern int a;
ina a = 10;//实例化
*/

template<typename T>
void extrenFun(T a){std::cout<<"a = "<<a <<std::endl;}

extern template void extrenFun<int>(int); //外部声明
template void extrenFun<int>(int); //使用外部模板必须进行显式实例化,这点和普通外部变量一样

int main()
{
	extrenFun(55); //调用 打印 a = 55;
	return 1;
}


模板用法3:匿名类型的声明不能用于模板实参位置

struct myStruct{} mys; //mystruct:类型 、mys:类型变量
struct {int a;} mys2;//匿名类型变量
typedef struct { int a;} myStruct2;//匿名类型
//定义一个模板类
template<typename T>class structCap{};
template<typename T> struct mytemplate{};
//定义一个模板函数
template<typename T>void toMy( T t){}

int main()
{
    struct myStruct3{} mys3; //定义一个局部类型变量mys3
    structCap<myStruct> a;//支持C++98
    structCap<myStruct2> b; //该语法只支持C++11及以上版本
    structCap<myStruct3> c; //该语法只支持C++11及以上版本
    // mytemplate< struct {int a;} > x;  匿名类型声明不允许出现在实参位置
    toMy(mys2); toMy(a); toMy(mys3);//该语法只支持C++11及以上版本,否则报错
    return 1;
    
}

模板用法4:模板作为返回值的非显式推导

template<typename Return,typename T1,typename T2>
inline Return max(const T1&t1,const T2& t2) 
{
    return t1>t2?t1:t2; //条件运算符返回最大值,注意,返回值,参数皆是模板
}
int main()
{
	//调用时只指定了返回值的类型为float
    float a = max<float>(2,3.1);//显示指定返回列表,隐式参数自动推导
    std::cout<<" a = " <<a <<std::endl;//打印 a = 3.1
 	return  1}

模板用法5:重载函数模板

阅读提示:下面对voerloadMax()函数重载了三次,主函数进了不同参数的调用和打印说明


//voerloadMax()模板函数被重载了三次,第二次和第三次为模板类型的重载

int const& overloadMax(int const& a,int const & b) //求俩个整数的大小
{
    std::cout<<" 1"<<std::endl;
    return a>b?a:b;
}
template<typename T>
const T&  overloadMax(const T&a,const T& b)//求俩个任意类型的变量大小
{
    std::cout<<" 2"<<std::endl;
    return a>b?a:b; 
}
template<typename T> 
T const& overloadMax(const T&a,const T& b,T const& c) //求是哪个任意类型的变量大小
{
    std::cout<<" 3"<<std::endl;
    return overloadMax(overloadMax(a,b),c);
}
//接下来我们调用各种函数观察
int main()
{
    overloadMax(2,4); //调用 1
    overloadMax('a',3.6); //调用 1 说明不同类型的参数只能使用非模板函数
    overloadMax(2,3.5); //调用 1
    overloadMax(3.4,5.6,6.6); //调用 3,2,2
    overloadMax<double>(3,4,5);
    //打印结果 1,1,1,3,2,2,3,2,2 
 	return  1}

模板用法6:任意数量模板(可变长参数模板)

可变长参数模板定义形式:template<typename… T>
参数的定义:T… t;
参数包的调用形式:fun(…t);
也可进行实参的实例化:fun() 、fun<double,int>,也就是对推导类型做了变长扩展
具体细节看下面代码


template<typename... T>//实参实例化
struct thisAny{ void fun(){std::cout<<"~~~~~~"<<std::endl;}};

template <typename T,typename U>
void print(T a,T b,U c) //利用模板默认参数的推导功能解析包的三个传入变量
{
    std::cout<<a<<std::endl;
    std::cout<<b<<std::endl;
    std::cout<<c<<std::endl;
}

template<typename... Args>//函数实参调佣
void functionAny(Args... args)
{
    print(args...);
}
//函数实现
int mian()
{
    //实参实例化 template<typename... T> tihsAny{};第一行定义
    thisAny<> type1; //只指明是模板类型的实例化
    thisAny<int> type2; //只指明是int一种类型的实例化
    thisAny<int ,double>type3; //指明是int,double两个类型的实例化
    //实参调用
    functionAny(1,2,"hello");
    //打印出 1,2,"hello"
 	return  1}

如果对于上述文章有疑问的同学,欢迎评论区留言,或者进Q群交流:928357277

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-15 11:29:21  更:2022-05-15 11:29:50 
 
开发: 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年5日历 -2024/5/11 2:30:35-

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