条款1.模板类型推导
- 引用或者指针,但不是万能引用
template<class T> class Test;
T类型被直接推导,const、指针属性保留,引用忽略。 - 万能引用 如果传入的是左值,则被推导为左值。 如果传入的是右值,则被推导为右值。
- 值类型 值类型全部编程T本身,也就是做成一个复制,会忽略所有的const以及volatile。
数组与函数实参的退化情况
数组和函数都会在模板中退化成指针。
但是通过传入引用的方式可以保留数组。
我们可以利用这种方式实现获取数组长度的模板。
template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
return N;
}
// 使用方法
int keyVal = {1, 3, 7, 9, 11, 22, 35};
int mapedVal[arraySize(keyVal)];
条款2.Auto类型推导
同模板类型推导,但是在变量初始化时如果使用大括号会导致意料外的情况。
// a会被推到位初始化表(std::initializer_list),而不是int
auto a = {1};
auto a{1};
// a会正常赋值为int
int a = {1};
int a{1};
需要注意的是lambda与函数返回值的auto使用的是模板推导而不是变量推导。
条款3.decltype类型推导
delctype
会保留所有的原来的类型。
对于类型为T的表达式,除非只有名字,其他表达式全部返回为T&
返回值推导中使用decltype(auto)
实际上是使用decltype
的方式来推导auto
返回值。
条款4.查看类型推导的结果
- 可以利用IDE
- 自己写一个模板,利用报错信息显示
template<class T> class TD;
因为没有实现,所以在尝试实例化的时候就会报错TD<decltype<x>> xType;//报错然后显示类型信息
- 使用type_id.name() 不同的平台有不同的实现,而且很多时候并不准确
- 可以用boost提供的库type_index
我们在实际使用当中依旧要记得推导规则。这些方法都只是辅助。