template模板详解第二集
软件 | 操作系统 | 标准 |
---|
visual stdio Code | win11 | C++11 |
获取代码资源点击这里或加Q群:928357277一起学习,博主期待你们的到来
使用头文件: #include <iostream> G++编译方式: g++ -std=c++11 .\main.cpp //在终端用C++11标准编译
模板用法1:默认参数及其推导
template<typename T ,typename X = char>
void defaultParameter( T a = 0 ,X x =0)
{
std::cout<<"a = "<<a <<std::endl;
std::cout<<"x = "<<x <<std::endl;
}
void printDefaultParameter()
{
defaultParameter(4);
defaultParameter(5,'l');
}
int main()
{
printDefaultParameter();
reuturn 1;
}
模板用法2:外部模板的声明及其实例化
提示:外部模板的声明在过程上同普通外部变量声明除了语法上的差别,基本一致
template<typename T>
void extrenFun(T a){std::cout<<"a = "<<a <<std::endl;}
extern template void extrenFun<int>(int);
template void extrenFun<int>(int);
int main()
{
extrenFun(55);
return 1;
}
模板用法3:匿名类型的声明不能用于模板实参位置
struct myStruct{} mys;
struct {int a;} mys2;
typedef struct { int a;} myStruct2;
template<typename T>class structCap{};
template<typename T> struct mytemplate{};
template<typename T>void toMy( T t){}
int main()
{
struct myStruct3{} mys3;
structCap<myStruct> a;
structCap<myStruct2> b;
structCap<myStruct3> c;
toMy(mys2); toMy(a); toMy(mys3);
return 1;
}
模板用法4:模板作为返回值的非显式推导
template<typename Return,typename T1,typename T2>
inline Return max(const T1&t1,const T2& t2)
{
return t1>t2?t1:t2;
}
int main()
{
float a = max<float>(2,3.1);
std::cout<<" a = " <<a <<std::endl;
return 1;
}
模板用法5:重载函数模板
阅读提示:下面对voerloadMax()函数重载了三次,主函数进了不同参数的调用和打印说明
int const& overloadMax(int const& a,int const & b)
{
std::cout<<" 1"<<std::endl;
return a>b?a:b;
}
template<typename T>
const T& overloadMax(const T&a,const T& b)
{
std::cout<<" 2"<<std::endl;
return a>b?a:b;
}
template<typename T>
T const& overloadMax(const T&a,const T& b,T const& c)
{
std::cout<<" 3"<<std::endl;
return overloadMax(overloadMax(a,b),c);
}
int main()
{
overloadMax(2,4);
overloadMax('a',3.6);
overloadMax(2,3.5);
overloadMax(3.4,5.6,6.6);
overloadMax<double>(3,4,5);
return 1;
}
模板用法6:任意数量模板(可变长参数模板)
可变长参数模板定义形式:template<typename… T> 参数的定义:T… t; 参数包的调用形式:fun(…t); 也可进行实参的实例化:fun() 、fun<double,int>,也就是对推导类型做了变长扩展 具体细节看下面代码
template<typename... T>
struct thisAny{ void fun(){std::cout<<"~~~~~~"<<std::endl;}};
template <typename T,typename U>
void print(T a,T b,U c)
{
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
std::cout<<c<<std::endl;
}
template<typename... Args>
void functionAny(Args... args)
{
print(args...);
}
int mian()
{
thisAny<> type1;
thisAny<int> type2;
thisAny<int ,double>type3;
functionAny(1,2,"hello");
return 1;
}
如果对于上述文章有疑问的同学,欢迎评论区留言,或者进Q群交流:928357277
|