using定义模板别名和显式指定模板参数

举报
无敌清风蓝 发表于 2023/08/31 22:05:43 2023/08/31
【摘要】 using定义模板别名和显式指定模板参数

92.using定义模板别名

typedef可以定义已经确定的

而using是可以定义没确定的

typedef std::map<std::string, std::string>map_s_s;

现在有个需求是希望定义一个类型,但这个类型不固定,例如对map的话,希望key是std::string,而value不希望固定为int或者string

C++98中为了实现则这样写,通过一个类模板
template<typename wt>
struct map_S
{
    typedef std::map<std::string, wt> type; //定义了一个类型
};C++11用using是这样,不需要定义类模板了
template<typename T>
using str_map_t = std::string, T>;

比较teypedef和using

typedef unsigned int uint_t;
using uint_t = unsigned int; //typedef的后两个内容返过来

typedef像是定义一个变量一样,先写类型名 再写别名

定义函数指针类型,之前是这样的

typedef int(*FunType)(int, int);

换成using则是更像赋值语句

using FunType = int(*)(int, int);

给函数指针模板起别名(看如何定义类型相关的模板)

template<typename T>
using myfunc_M = int(*)(T, T);

int RealFunc(int i, int j)
{
	return 3;
}


int main()
{
	myfunc_M<int>pointFunc;
	pointFunc = RealFunc;
	cout << pointFunc(1, 6) << endl; //返回是3
	return 0;
}

总结就是

  • 用using定义类型相关模板与定义普通类型差不太多,只是在前面加上一个template开头的模板参数列表
  • 在using中使用的这种模板,既不是类模板,也不是函数模板,可以看作是一个新的模板形式-别名模板

93.显式指定模板参数

template<typename T1, typename T2, typename T3>
T1 sum(T2 i, T3 j)
{
    T1 result = i + j;
    return result;
}

在main中

auto result = sum(2000000000, 2000000000);//报错的
cout << result << end;

报错原因是T2,T3可以推断出来,但是T1推断不出来的

所以至少T1也传一个

auto result = sum<int>(2000000000, 2000000000);

但还是报错,因为int存不下这么大的数字

所以该为double,发现还是不行

因为右边两个20亿,已经超过int的存储范围,所以两个int加完结果就是错的,给double的时候也是错的

所以都写成double

auto result = sum<double, double, double>(2000000000, 2000000000);

提供显式的类型模板实参的方法是从左到右按照顺序与对应的参数匹配,对于能推到出来的模板参数,可以省略,不过如果这个参数省略了,那后面的也得省略,例如下面的是能编译过的

auto result = sum<double, double>(2000000000, 2000000000);
auto result = sum<double>(2000000000, 2000000000);//这个编译没问题,但结果是错的

如果像上面这个设计函数模板,则三个模板参数都得提供模板实参

template<typename T1, typename T2, typename T3>
T3 sum(T1 i, T2 j)
{
    T3 result = i + j;
    return result;
}

系统不支持把T1,T2参数空着只提供T3的,比如这个就是错误的

auto result = sum<, , double>(12,13);
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。