目录
一类型推导
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=#
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=#
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);
}