#include <iostream>
using namespace std;
#define PI 3.14
template<class T>//早期写成 template<class T>
T maxt(T x, T y)
{
return (x > y) ? x : y;
}
//类模版
template<typename T>
class Circle{
private:
T radius;
public:
Circle(){};//无参构造函数大括号要补充好
Circle(T r):radius(r){};
T area();
// {
// return radius*radius*PI;
// }
};
//在类外实现成员函数
template<typename T>
T Circle<T>::area()
{
return radius*radius*PI;
}
//单参数类模板
template<typename T>
struct S_tmp{
T a;
};
//以单参数类模板定义为参数的模板
template<template<typename S> class T>
struct MyTest{
T<int> test;//也不能在这作初始化赋值T<int> test(10);
void show()
{
cout << "test show"<< endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//cout << maxt<int>(4, 6) << endl;//当编译器能够从参数类型推测出模版参数所需的实际类型时,尖括号中的类型可省略
//cout << maxt<double>(6.98, 5.33) << endl;
//Circle<int> c1(5);
//Circle<double> c2(0.5);
//cout << c1.area() << endl;
//cout << c2.area() << endl;
MyTest<S_tmp> TT;//MyTest<Circle> TT;
TT.show();
return 0;
}
template<typename RT,typename T,typename S>
RT mymax(T a, S b)
{
return (a > b) ? a : b;
}
template<typename T,typename S>
auto mymax2(T a, S b)->decltype(a*b)
{
return (a > b) ? a : b;
}
int _tmain(int argc, _TCHAR* argv[])
{
//当函数返回值的类型不能由形参直接确定时,要显示提供模版实参,至少提供返回值类型
cout << mymax<double,int,double>(5, 6.2) << endl;
cout << mymax<double>(5, 6.2) << endl;
//或者用auto
cout << mymax2(5, 6.2) << endl;
return 0;
}
指针实参
和前面一样
T show(T a)
{
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
double a = 5;
double* pd = &a;
cout <<*show(pd) << endl;
return 0;
}