接着来学习类模板作为函数参数传入是如何使用,如果需要把类模板作为参数一起传入到函数中,一般有三种情况,下面分别用代码来解释这三种情况。
1.指定传入类型
就是在参数中,就指定类型,而不是<class T1, class T2>, 而是直接指定确定类型,例如<string, int>。看下面代码,在printPerson1()就是参数指定特定类型
#include <iostream>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
//类模板
template <class T1, class T2>
class Person
{
public:
Person(T1 Name, T2 Age)
{
this->m_Name = Name;
this->m_Age = Age;
}
T1 m_Name;
T2 m_Age;
void showPerson()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
};
// 指定传入类型
void printPerson1(Person<string, int> &p)
{
p.showPerson();
}
void test01()
{
Person<string, int> p("张三", 19);
printPerson1(p);
}
int main()
{
test01();
system("pause");
return 0;
}
这段代码可以成功运行起来, 函数参数用到了类模板,传入的时候就指定了类型。
2.参数模板化
就是参数也使用模板,但是在参数上一行需要使用template说明参数T1 T2是模板参数
#include <iostream>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
//类模板
template <class T1, class T2>
class Person
{
public:
Person(T1 Name, T2 Age)
{
this->m_Name = Name;
this->m_Age = Age;
}
T1 m_Name;
T2 m_Age;
void showPerson()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
};
// 参数模板化
template <class T1, class T2>
void printPerson1(Person<T1, T2> &p)
{
p.showPerson();
}
void test01()
{
Person<string, int> p("张三", 19);
printPerson1(p);
}
int main()
{
test01();
system("pause");
return 0;
}
上面50 51行代码就是参数模板化。这样可以写不同test()方法,里面不同参数类型都可以调用printPerson()函数。
如果我们想看T1 和T2模板中类型,可以使用下面方法进行打印。
// 参数模板化
template <class T1, class T2>
void printPerson1(Person<T1, T2> &p)
{
p.showPerson();
cout << "T1 的类型:" << typeid(T1).name() << endl;
cout << "T2 的类型:" << typeid(T2).name() << endl;
}
运行结果
上面第二行,在C++中string类型的原名就是这么长。不同C++编译环境,string的名称显示都不一样
3.整个类模板化传入
就是类名称和参数都做成一个模板,就一个T
#include <iostream>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
//类模板
template <class T1, class T2>
class Person
{
public:
Person(T1 Name, T2 Age)
{
this->m_Name = Name;
this->m_Age = Age;
}
T1 m_Name;
T2 m_Age;
void showPerson()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
};
// 整个参数模板化
template <class T>
void printPerson1(T &p)
{
p.showPerson();
cout << "T 的类型:" << typeid(T).name() << endl;
}
void test01()
{
Person<string, int> p("张三", 19);
printPerson1(p);
}
int main()
{
test01();
system("pause");
return 0;
}
运行
上面打印类型的名称,显示不是很友好,能看出一个大概。没有在VS编译环境显示友好。下面贴一个在vs 2015上运行的效果截图
这个在VS IDE环境下就显示很清楚,这个T类型是class 类名称是Person,里面有两个参数,一个是string,一个是int类型。