C++中的类型推导

本文介绍了C++中的类型推导,包括其意义、Boost安装和使用场景,特别是详细解析了类型模板参数推导规则,如值传递、指针传递、引用传递和万能引用的推导情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一类型推导

1.1意义

1.2boost安装

1.3类型推导的使用场景

1.31类型模板参数推导规则


一类型推导

1.1意义

理解编译器推导规则有利于高效的使用c++ 从明显或者冗余的类型拼写中解放出来,这样使得c++代码更具有适配型

1.2boost安装

sudo apt update sudo apt-get install libboost-all-dev

1.3类型推导的使用场景

1.31类型模板参数推导规则

1.值传递

2.指针传递

3.引用传递

4.万能引用(只能在函数模板中使用) void print(T&& p) 既能接受左值又能接收右值

1.按值传递:

int                      ---->推导规则: T:int    t:int

const int            ---->推导规则: T:int    t:int  (忽略const属性)

int&                    ---->推导规则: T:int    t:int  (去引用化)

volatile int          ---->推导规则: T:int    t:int  (去修饰)

const int&          ---->推导规则: T:int    t:int  (忽略const属性,去引用化)

#include<iostream>
#include<boost/type_index.hpp>
#include<vector>
using boost::typeindex::type_id_with_cvr;
using namespace std;

template <typename T>
void print(T t)    //值传递
{
    cout<<"t = "<<t<<endl;
    cout<<"T type:"<<type_id_with_cvr<T>().pretty_name()<<endl;
    cout<<"t type:"<<type_id_with_cvr<decltype(t)>().pretty_name()<<endl;
}
/*
按值传递:
int              ---->推导规则: T:int    t:int
const int        ---->推导规则: T:int    t:int  (忽略const属性)
int&             ---->推导规则: T:int    t:int  (去引用化)
volatile int     ---->推导规则: T:int    t:int  (去修饰)
const int&       ---->推导规则: T:int    t:int  (忽略const属性,去引用化)

*/

int main()
{
    int num=5;
    int& num2=num;

    volatile int num3=4;
    const int& count=6;
    print(count);

}

2.指针传递

int*                 ---->推导规则: T:int             t:int*

const int*        ---->推导规则:T:int const    t:int const*  

#include<iostream>
#include<boost/type_index.hpp>
#include<vector>
using boost::typeindex::type_id_with_cvr;
using namespace std;

template <typename T>
void print(T* t)    //指针传递
{
    //(*t)++;
    cout<<"t = "<<*t<<endl;
    cout<<"T type:"<<type_id_with_cvr<T>().pretty_name()<<endl;
    cout<<"t type:"<<type_id_with_cvr<decltype(t)>().pretty_name()<<endl;
}

/*
按指针传递:
int*             ---->推导规则: T:int          t:int*
const int*        ---->推导规则:T:int const    t:int const*  

*/

int main()
{
    int num=5;
    int& num2=num;

   int*p=&num;
    const int count=6;
    print(p);
    cout<<"num = "<<num<<endl;

    print(&count);
}

3.引用传递

按引用传递:

int&                 ---->推导规则: T:int          t:int&

const int&        ---->推导规则: T:int const    t:int

const& int        ---->推导规则: T:int          t:int&

#include<iostream>
#include<boost/type_index.hpp>
#include<vector>
using boost::typeindex::type_id_with_cvr;
using namespace std;

template <typename T>
void print(T&t)    //引用传递
{
  
    cout<<"t = "<<t<<endl;
    cout<<"T type:"<<type_id_with_cvr<T>().pretty_name()<<endl;
    cout<<"t type:"<<type_id_with_cvr<decltype(t)>().pretty_name()<<endl;
}
int main()
{
    int num=5;
    int& num2=num;

   int*p=&num;
    const int &count=6;
    print(count);
    //cout<<"num = "<<num<<endl;

   // print(num2);
}

4.万能引用传递

右值(50)常量         ---->推导规则: T:int                t:int&&

int &                      ---->推导规则: T:int &             t:int &

int &&                    ---->推导规则: T:int &             t:int &

const int&              ---->推导规则: T:int const&    t:int const&

注意:

万能引用

1.万能引用只存在于函数模板中,不是一种新的数据类型

2.const属性会剥夺万能引用的权限 void func(const T&&parm)--->不是万能引用 (右值引用) 3.模板参数必须紧跟&&符号

#include<iostream>
#include<boost/type_index.hpp>
#include<vector>
using boost::typeindex::type_id_with_cvr;
using namespace std;

template <typename T>
void print(T&&t)    //万能引用传递
{
  
    cout<<"t = "<<t<<endl;
    cout<<"T type:"<<type_id_with_cvr<T>().pretty_name()<<endl;
    cout<<"t type:"<<type_id_with_cvr<decltype(t)>().pretty_name()<<endl;
}
int main()
{
    int num=5;
    int&& num2=20;

   //int p=num;
    const int &count=6;
    //print(50);
    //cout<<"num = "<<num<<endl;

    print(5);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值