#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>();
#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 黄强