/* C++ 模板:模板是泛型编程的基础,可以使用模板来定义函数和类,分为: (1)函数模板 (2)类模板 */ /*********1-函数模板************/ /* 模板函数定义的一般形式如下所示: template <class type=""> ret-type func-name(parameter list) { // 函数的主体 } type 是函数所使用的"数据类型"的占位符名称。 定义模板时typename与class这两个关键字可以替换 */ #include <iostream> #include <string> using namespace std; //定义函数模板,使用时Max(a,b) template <typename t=""> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main1 () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; } /*********2-类模板************/ /* 类模板泛型类声明的一般形式如下所示: template <class type=""> class class-name { . . . } type 是占位符类型名称,可以在类被实例化的时候进行指定 可以使用一个逗号分隔的列表来定义多个泛型数据类型 */ //定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作 #include <iostream> #include <vector> #include <cstdlib> #include <string> #include <stdexcept> using namespace std; //定义类模板, template <class t=""> class Stack { private: vector<t> elems; // 元素 public: //类中声明函数,类外定义函数模板 void push(T const&); // 入栈 void pop(); // 出栈 T top() const; // 返回栈顶元素 bool empty() const{ // 如果为空则返回真。 return elems.empty(); } }; //定义函数模板push template <class t=""> void Stack<t>::push (T const& elem) { // 追加传入元素的副本 elems.push_back(elem); } //定义函数模板pop template <class t=""> void Stack<t>::pop () { if (elems.empty()) { //栈为空时抛出异常 throw out_of_range("Stack<>::pop(): empty stack"); } // 删除最后一个元素 elems.pop_back(); } //定义函数模板top template <class t=""> T Stack<t>::top () const { if (elems.empty()) { //栈为空时抛出异常 throw out_of_range("Stack<>::top(): empty stack"); } // 返回最后一个元素的副本 return elems.back(); } int main() { try { Stack<int> intStack; // int 类型的栈 Stack<string> stringStack; // string 类型的栈 // 操作 int 类型的栈 intStack.push(7); cout << intStack.top() <<endl; // 操作 string 类型的栈 stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); //此时为空调用函数会抛出异常 } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1; } } 备注:此为学习笔记,课程来源菜鸟教程。 </string></int></t></class></t></class></t></class></t></class></stdexcept></string></cstdlib></vector></iostream></class></typename></string></iostream></class>