模板参数的推导

来源:互联网 发布:旅行商问题算法 编辑:程序博客网 时间:2024/05/18 03:12
#include  "stdafx.h"
#include<iostream>  
using namespace std;
 
template<typename T>
void f1(T*)
{
cout << typeid(T).name() << endl;
}


template<typename T, int N>
void f2(   T   (&p) [N]  ) //参数p 为T [N]  数组的引用
{
cout <<N <<  ", "<< typeid(T).name() << ", " << p[2] << endl;
}


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




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






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


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






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


template<typename T>
class M {
};
template<typename T>
class N : public M<T> {
};


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




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


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


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






template <typename T>
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<long> 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<Y>(); 

}


Created  by   黄强