栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++template模板的使用(中):模板参数推导

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++template模板的使用(中):模板参数推导

template模板详解第二集
软件操作系统标准
visual stdio Codewin11C++11

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

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

学习目录
    • 模板用法1:默认参数及其推导
    • 模板用法2:外部模板的声明及其实例化
    • 模板用法3:匿名类型的声明不能用于模板实参位置
    • 模板用法4:模板作为返回值的非显式推导
    • 模板用法5:重载函数模板
    • 模板用法6:任意数量模板(可变长参数模板)

模板用法1:默认参数及其推导
//函数模板带默认参数仅不支持C++98的模板特性,C++11之后的函数模板也不需要遵循从右往左的指定规则
//如template也被视为正确
template
void defaultParameter( T a = 0 ,X x =0) //模板函数带默认参数
{
    std::cout<<"a = "<

template
void extrenFun(T a){std::cout<<"a = "<(int); //外部声明
template void extrenFun(int); //使用外部模板必须进行显式实例化,这点和普通外部变量一样

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


模板用法3:匿名类型的声明不能用于模板实参位置
struct myStruct{} mys; //mystruct:类型 、mys:类型变量
struct {int a;} mys2;//匿名类型变量
typedef struct { int a;} myStruct2;//匿名类型
//定义一个模板类
templateclass structCap{};
template struct mytemplate{};
//定义一个模板函数
templatevoid toMy( T t){}

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

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

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

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

int const& overloadMax(int const& a,int const & b) //求俩个整数的大小
{
    std::cout<<" 1"<b?a:b;
}
template
const T&  overloadMax(const T&a,const T& b)//求俩个任意类型的变量大小
{
    std::cout<<" 2"<b?a:b; 
}
template 
T const& overloadMax(const T&a,const T& b,T const& c) //求是哪个任意类型的变量大小
{
    std::cout<<" 3"<
    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(3,4,5);
    //打印结果 1,1,1,3,2,2,3,2,2 
 	return  1;
}

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

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

template//实参实例化
struct thisAny{ void fun(){std::cout<<"~~~~~~"<
void print(T a,T b,U c) //利用模板默认参数的推导功能解析包的三个传入变量
{
    std::cout<//函数实参调佣
void functionAny(Args... args)
{
    print(args...);
}
//函数实现
int mian()
{
    //实参实例化 template tihsAny{};第一行定义
    thisAny<> type1; //只指明是模板类型的实例化
    thisAny type2; //只指明是int一种类型的实例化
    thisAnytype3; //指明是int,double两个类型的实例化
    //实参调用
    functionAny(1,2,"hello");
    //打印出 1,2,"hello"
 	return  1;
}

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

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号