模板模板参数推导例子

#include  "stdafx.h"
#include  
using namespace std;
 
template
void f1(T*)
{
cout << typeid(T).name() << endl;
}


template
void f2(   T   (&p) [N]  ) //参数p 为T [N]  数组的引用
{
cout < }


class S {
public:
void f(double*) 
{}
};




template
void f3(T1(T2::*)(T3*))
{
cout  << typeid(T1).name() <<"    " << typeid(T2).name() << "    " << typeid(T3).name() << endl;
}






template
class X {
public:
typedef int I;
void f(int) 
{ }
};


template
void  f4(void (X::*  p)(typename X::I))
{
cout << N << endl;
}
// 译注:意思是: f4的参数是个「X 成员函数」,
// 该函数的回返类型为 void,接受一个 X::I参数。






template
void f5(T  t1 )
{
cout << typeid(T).name() <<","< }
 
 


template
class M {
};
template
class N : public M {
};


template 
void f7(M  )
{
cout << typeid(T).name() << endl;
}




template 
void f8(T)
{
cout << typeid(T).name() << endl;
}


template 
void f9(T& t)
{
cout << typeid(T).name() << endl;
}


/*
  T  &  t 表示引用变量
  T  && t  表示可以右值引用参数
*/
template
void  f10(T && t)
{
cout << typeid(t).name() << endl;
}






template
void  f11( )
{
typename  T::vType    t;
  cout << typeid(t).name() << endl; 
}


class Y
{
public:
typedef   float    vType;
};


 
 
 








int main()
{


int ****p = 0;
f1(p); //被推导为 int**


int  b[42] = {1,2,3,4,5};
f2(b); // E被推导为  int, N被推导为 42


   
f3(&S::f); // 推导结果: T1=void, T2=S, T3=double


f4(&X<33>::f); // 正确: N被推导为 33


void(*pf)(char) = &f5;//推导成功,并将 T替换为 char
pf('A' );
 
 


N n1;
f7(n1);// 推导成功: T被替换为 long


char *p8 = "abc";
f8(p8);// 推导成功: T被替换为 char* 
f9(p8);// 推导成功: T被替换为 char* 


char  p9[] = "abc";
f8(p9);// 推导成功: T被替换为 char* 
f9(p9);// 推导成功: T被替换为 char [4]


double  pp[20];
f8(pp);// 推导成功: T被替换为 double* 
f9(pp);// 推导成功: T被替换为 double [20]






int   aa = 99;
f9(aa); //正确
  //f9(100)//错误, 必须传入左值
f10(aa); //正确
f10(100); //正确,可以传入右值
f10(0.003); //正确,可以传入右值
f10("sdfsf"); //正确,可以传入右值




f11();
 


}

你可能感兴趣的:(template)