首页 > 其他分享 >函数模板类型推断

函数模板类型推断

时间:2024-03-30 22:13:26浏览次数:30  
标签:tmprv const 函数 int myfunc 推断 类型 模板

先看一段代码:

template<typename T>
void myfunc(T& tmprv) {
    cout << "--------------------begin--------------------" << endl;
    using boost::typeindex::type_id_with_cvr;
    cout << "T=" type_id_with_cvr<T>().pretty_name() << endl; // 显示T类型
    cout << "tmprv=" << type_id_with_cvr<decltype(tmprv)>().pretty_name() << endl;
    cout << "---------------------end--------------------" << endl;
}

这些代码的主要作用是显示模板参数T的类型信息以及函数模板中参数tmprv的类型信息。

如果将myfunc()函数模板形参列表中的tmprv类型从T&修改为cost T&,如下所示:

template<typename T>
void myfunc(const T& tmprv) {
    ...
}

int main() {
    myfunc(100);
}

结果显示T被推断为int类型,tmprv被推断为const int &类型。T的类型不仅和调用这个函数模板时传入的实参(100)有关,还和整个tmprv的类型(const T&)有关。

指针或引用类型

如果tmprv是引用类型,但不是万能引用,把刚才myfunc()函数模板形参的tmprv类型从const T &修改回T &,如下所示:

template<typename T>
void functest(T& tmprv) {
    ...
}

int main() {
    int i = 10;        // i的类型为int
    const int j = i;   // j的类型为const int
    const int& k = i;  // k的类型为const int &
    
    myfunc(i); // result T = int, tmprv = int &
    myfunc(j); // result T = int const, tmprv = int const &
    myfunc(k); // result T = int const, tmprv = int const &
}

根据结果显示,可以得出以下结论:

  • 若实参是引用类型,则引用部分会被忽略掉,T不会被推导为引用类型;
  • 当向引用类型的形参tmprv传入const类型实参时,形参就会成为const引用,实参的const属性会成为类型模板参数T类型推导的组成部分;

如果tmprv是指针类型,修改myfunc()函数模板形参列表中的tmprv类型,如下所示:

template<typename T>
void mufunc(T* tmprv) {
    ...
}

int main() {
    int i = 10;
    const int* pi = &i;
    myfunc(&i); // T = int, tmprv = int*
    myfunc(pi); // T = int const, tmprv = int const *
}

根据结果显示,可以得出以下结论:

  • tmprv中如果没有const,则实参中的const会被代入T类型;如果有const,则T类型中不会带const。

万能引用类型

修改myfunc()函数模板形参列表中的tmprv类型,如下所示:

template<typename T>
void myfunc(T&& tmprv) {
    ...
}

int main() {
    int i = 10;
    const int j = i;
    const int& k = i;
    myfunc(i); // i是左值, T = int &, tmprv = int &
    myfunc(j); // j是左值,T = int const &, tmprv = int const &
    myfunc(k); // k是左值,T = int const &, tmprv = int const &
    
    myfunc(100); // 100是右值,T = int, tmprv = int&&
}

 

标签:tmprv,const,函数,int,myfunc,推断,类型,模板
From: https://www.cnblogs.com/love-9/p/18106118

相关文章

  • WPF中继承ItemsControl子类控件数据模板获取选中属性
    需求场景列表类控件,如ListBox、ListView、DataGrid等。显示的行数据中,部分内容依靠选中时触发控制,例如选中行时行记录复选,部分列内容控制显隐。案例源码以ListView为例。Xaml部分<ListViewItemsSource="{BindingMyPropertys}"IsManipulationEnabled="False"><List......
  • P8306 【模板】字典树
    原题链接题解1.建议去B站上看看动画演示,你就明白怎么回事了2.如何用代码实现呢?看完你就明白了code#include<bits/stdc++.h>usingnamespacestd;intnum=0;inttree[3000006][75]={0};intcnt[3000006]={0};chars[3000006];intans;intt,n,q;//放全局变量是为了加......
  • 高等数学基础篇之判断一元函数是否连续、可导、可微,极限、原函数是否存在
    一元函数:一、极限存在的条件二、连续的条件三、可导的条件四、可微的条件五、原函数存在的条件目录一、极限存在的条件1.自变量趋于无穷大时函数的极限2.自变量趋于有限值时函数的极限二、连续的条件1.自变量改变量趋于0时,函数值改变量也趋于02.该点的极限等于该......
  • 算法模板 v1.10.5.20240330
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • (八)Rust 函数和注释
    函数在Rust里,声明函数使用fn关键字,按照惯例,针对函数和变量名,Rust使用snakecase命名规范:所有的字母都是小写,单词之间使用下划线分开,例如:函数的参数定义函数时里边定义的参数,叫形参(parameters)调用函数时传递的具体参数,叫实参(arguments)在函数签名里,必须声明每个参数的类......
  • python-numpy-常用函数详解
    文章目录一、函数详解np.empty(num_points)np.zeros(shape,dtype=float,order='C')np.tile(A,reps)np.newaxisnp.stack(arrays,axis=0)np.roll(a,shift,axis=None)np.repeat(a,repeats,axis=None)arr.reshape(shape)arr.ravel()np.mean(a,axis=None,dtype=None......
  • 多态在模板类中的应用
    先看一个多态的例子:classHuman{public:virtualvoideat=0;virtual~Human(){}};classMen:publicHuman{public:virtualvoideat(){cout<<"男人"<<endl;}};classWomen:publicHuman{public:virtu......
  • 帝国cms自适应html5古诗词历史名句书籍文章资讯网站源码整站模板sinfo插件带采集会员
    (购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源)帝国cms自适应html5古诗词名句书籍文章资讯网站源码整站模板s......
  • 并查集模板
    目录并查集的存储结构并查集查询路径压缩并查集合并合并优化--启发式优化合并优化--按秩合并可撤销并查集算法原理重要操作实现并查集是一种巧妙优雅的数据结构,主要用于解决元素分组和不相交集合的合并和查询问题。并查集是大量的树(单个节点也算是树)经过合并生成一......
  • python3 : 可变数据类型/不可变数据类型 与函数传参
    按语:        可变/不可变数据类型与函数传参:               全局变量为不可变数据或可变数据,并且,用作函数参数,                               函数的局部变量可能会导致全局变量的数值变化。1、可变......