持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
C++的模板对于类型推导来说,在通常情况推导出的类型和我们期望的是一致的,然而事情并不是总是这样如此美妙。
引用
template<typename T>
void f(T& parm){
}
int main()
{
int x = 27;
const int cx = x;
const int& rx= x;
f(x);
f(cx);
f(rx);
return 0;
}
f(x); T:int,parm:int &
f(cx); T:const int,parm:const int &
f(rx); T:const int,parm:const int &
template<typename T>
void f(const T& parm){
}
int main()
{
int x = 27;
const int cx = x;
const int& rx= x;
f(x);
f(cx);
f(rx);
return 0;
}
f(x); T:int,parm:const int &
f(cx); T:int,parm:const int &
f(rx); T:int,parm:const int &
指针
template<typename T>
void f(T* parm){
}
int main()
{
int x = 27;
const int *px = &x;
f(&x);
f(px);
return 0;
}
f(&x); T:int,parm:int * f(px);T:const int,parm:const int *
完美引用
template<typename T>
void f(T&& parm){
}
int main()
{
int x = 27;
const int cx = x;
const int& rx= x;
f(x);
f(cx);
f(rx);
f(27);
return 0;
}
f(&x); T:int &,parm:int & f(px);T:const int&,parm:const int &
f(rx);T:const int&,parm:const int &(&&抵消了一样,没用了)
f(27);T:int,parm:int &&
值
template<typename T>
void f(T parm){
}
int main()
{
int x = 27;
const int cx = x;
const int& rx= x;
f(x);
f(cx);
f(rx);
f(27);
return 0;
}
f(x); T:int,parm:int
f(cx); T:int,parm:int
f(rx); T:int,parm:int
字符数组和字符指针
template<typename T>
void f(T parm){
}
int main()
{
const char* const ptr = "FUN with pointers";
f(ptr); //const char*
}
template<typename T>
void f(T parm){
}
void f(T& parm){
}
int main()
{
const char name[] = "J.P.Briggs";//name类型为const char [13]
const char* ptrToName = name;
f(name); //const char*
f(name); //const char[13]
}
void myFunc(int* parm);
void myFunc(int parm[]);一样
栗子
template<typename T,std::size_t N>
const size_t arraySize(T (&) [N]) noexcept{
return N;
}
int main()
{
int keyvals[] = {1,3,7,9,11,22,35};
int mappedVals[arraySize(keyvals)];
cout<<arraySize(keyvals)<<endl;
return 0;
}
void someFunc(int,double);
template<typename T>
void f1(T param);
template<typename T>
void f2(T& param);
f1(someFunc); //void(*)(int,double)
f2(someFunc); //void(&)(int,double)
数组类型参数
数组类型和指针指向一个数组这是两个不同的类型,数组如果传递给函数会退化为指针,因此在模板参数类型的时候,如果参数类型是T,那么数组会被推导成指针类型,如果参数类型是T&,那么数组就会被推导成数组类型,可以使用sizeof求数组的大小。
函数作为参数
函数作为参数会被退化成函数指针,如果参数类型是T,函数会被推导成一个函数指针,指向这个函数,如果参数类型是T&,那么函数会被推导成一个引用指向函数的引用。