1.函数模板书写格式:
template<typename T>//其后写上相应的模板函数
void example(T a,T b)
{
cout<<"这是一个模板函数的示例"<<endl;
}
2.函数模板与普通函数的调用规则
<1>如果普通函数和模板函数都可以调用,则优先调用普通函数
void myFunc(int a, int b)
{
cout << "这是一个普通函数" << endl;
}
template<typename T>
void myFunc(T a,T b)
{
cout << "这是一个模板函数" << endl;
}
void test01()
{
int a = 10;
int b = 20;
myFunc(a, b);
}
int main()
{
test01();
return 0;
}
<2>可以通过空模板参数列表来强制调用函数模板
void myFunc(int a, int b)
{
cout << "这是一个普通函数" << endl;
}
template<typename T>
void myFunc(T a,T b)
{
cout << "这是一个模板函数" << endl;
}
void test01()
{
int a = 10;
int b = 20;
myFunc<>(a, b);//空模板参数列表<>
}
int main()
{
test01();
return 0;
}
<3>函数模板也可以发生重载
template<typename T>
void myFunc(T a,T b)
{
cout << "这是一个模板函数" << endl;
}
template<class T>
void myFunc(T a, T b,T c)
{
cout << "这是一个重载的模板函数" << endl;
}
<4>如果函数模板可以产生更好的匹配调用,则优先调用函数模板
void myFunc(int a, int b)
{
cout << "这是一个普通函数" << endl;
}
template<typename T>
void myFunc(T a,T b)
{
cout << "这是一个模板函数" << endl;
}
void test01()
{
char a = 'a';
char b = 'b';
myFunc(a, b);
}
总结:既然提供了函数模板,就不要再书写同名的普通函数,容易产生二义性。
3.模板的局限性
template<typename T>
bool myCompare(T& a, T& b)
{
if (a == b)
{
return true;
}
else
{
return false;
}
}
void test01()
{
int a = 10;
int b = 10;
bool ret = myCompare(a, b);
if (ret)
{
cout << "a = b" << endl;
}
else
{
cout << "a != b" << endl;
}
}
//如果传入参数是“类”类型的数据,则无法进行比较,此时需要对函数模板进行具体化,如下所示
class Person
{
public:
Person(string name,int age)
{
this->name = name;
this->age = age;
}
string name;
int age;
};
template<typename T>
bool myCompare(T& a, T& b)
{
if (a == b)
{
return true;
}
else
{
return false;
}
}
template<>bool myCompare(Person& a, Person& b)//函数模板具体化
{
if (a.age == b.age && a.name == b.name)
{
return true;
}
else
{
return false;
}
}