#include <cstdlib>
#include <iostream>
using namespace std;
template<typename T> //定义为函数模板 泛型为T表示
void swap1(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
int main()
{
int a = 12;
int b = 10;
cout << a << " " << b << endl;
swap1(a,b); //自动类型推导调用
cout << a << " " << b << endl;
float a1 = 120;
float b1 = 100;
cout << a1 << " " << b1 << endl;
swap1<float>(a1,b1); //具体类型显示调用
cout << a1 << " " << b1 << endl;
return 0;
}
template <> void swap1(float& a, float& b)第二种:
template <> void swap1<float>(float& a, float& b)b.函数模板特化的应用:在一些情况不能完全使用泛型编程的时候(即函数模板不适合所有数据类型的时候),就需要使用特化把特殊情况,单独写成函数。如上面代码,当swap1函数的参数是float型的时候,就不再根据原先的函数模板生成具体的函数了,直接调用特化的函数。
#include <iostream>
using namespace std;
template <typename T>
void swap1(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
template <>
void swap1(float& a, float& b) //等效void swap1<float>(float& a, float& b)
{
float c = a;
a = b;
b = c;
cout << "hello float swap1" << endl;
}
int main()
{
int a = 100;
int b = 120;
cout << a << " " << b << endl;
swap1(a, b);
cout << a << " " << b << endl;
float fa = 1.1;
float fb = 1.2;
cout << fa << " " << fb << endl;
swap1(fa, fb);
cout << fa << " " << fb << endl;
return 0;
}#include <iostream>
using namespace std;
void swap1(int& a, int& b) //与函数模板是重载关系
{
int c = a;
a = b;
b = c;
cout << "swap1 int" << endl;
}
template <typename T>
void swap1(T& a, T& b)
{
T& c = a;
a = b;
b = c;
cout << "swap1 Ta Tb" << endl;
}
template <typename T> //与函数模板重载关系
void swap1(T& a, T& b, T& d)
{
T& c = a;
a = b;
b = c;
cout << "swap1 Ta Tb Td" << endl;
}
int main()
{
int a = 100;
int b = 120;
swap1(a,b); //对于模板与具体函数重载 编译器默认调用具体函数
swap1<int>(a,b); //可以直接指明使用函数模板 说明类型
swap1<>(a,b); //可以直接指明使用函数模板 编译器自动检测类型
float fa = 1.0;
float fb = 1.2;
swap1(fa,fb); //具体函数实现不了 使用函数模板进行匹配
char ca = ‘a‘;
char cb = ‘b‘;
char cc = ‘c‘;
swap1(ca, cb, cc); //函数模板之间也是可以发生重载的
}#include <iostream>
using namespace std;
int max(int a, int b)
{
cout << "max int" << endl;
return a>b?a:b;
}
template <typename T>
T max(T a, T b)
{
cout << "max T" << endl;
return a>b?a:b;
}
int main()
{
int a = 12;
int c = 10;
float b = 1.0;
cout << max(a,b) << endl;
// cout << max<>(a,b) << endl; //这条语句是不可以 强制使用模板的 因为模板中T必须是一个类型
return 0;
}
注意:函数模板不允许自动类型转换(即typename都是一致的),普通函数能够进行自动类型转换#include <iostream>
using namespace std;
template <typename T1, typename T2, typename Ri>
Ri add(T1 a, T2 b)
{
return static_cast<Ri>(a + b);
}
int main()
{
int a = 12;
float b = 2.98;
cout << add<int,float,double>(a, b) << endl;
return 0;
}
c.切记,在函数模板中声明了类型参数为返回值类型时(即Ri add(T1 a, T2 b)中的Ri就是),编译器就无法进行自动类型推导了。这里有一个解决办法,就是将返回类型参数声明到第一个参数位置,调用时只需显示声明返回类型参数即可。代码如下:#include <iostream>
using namespace std;
template <typename Ri, typename T1, typename T2> //注意Ri的位置
Ri add(T1 a, T2 b)
{
return static_cast<Ri>(a + b);
}
int main()
{
int a = 12;
float b = 2.98;
cout << add<double>(a, b) << endl; //因为Ri为第一个参数位置
return 0;
}
原文:http://blog.csdn.net/mbh_1991/article/details/18181301