C++:模板 逃离我推掉我的手 2022-06-16 13:59 198阅读 0赞 http://[blog.csdn.net/pipisorry/article/details/72353250][blog.csdn.net_pipisorry_article_details_72353250] # C++ 模板 # 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。 库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。 可以使用模板来定义函数和类。[ ][Link 1] [皮皮blog][Link 1] # 函数模板 # 模板函数定义的一般形式如下所示: template <class type> ret-type func-name(parameter list)\{ template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)\{ 函数体 \} 其中template和class是关见字,class可以用typename 关见字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。 ## 实例 ## 函数模板返回两个数的最大值: \#include <iostream> \#include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) \{ return a < b ? b:a; \} int main ()\{ 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; \} 当上面的代码被编译和执行时,它会产生下列结果: Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World [皮皮blog][Link 1] # 类模板 # 正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示: 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(); \} \}; template <class T> void Stack<T>::push (T const& elem) \{ // 追加传入元素的副本 elems.push\_back(elem); \} template <class T> void Stack<T>::pop () \{ if (elems.empty()) \{ throw out\_of\_range("Stack<>::pop(): empty stack"); \} // 删除最后一个元素 elems.pop\_back(); \} 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; \} \} 当上面的代码被编译和执行时,它会产生下列结果: 7 hello Exception: Stack<>::pop(): empty stack [皮皮blog][Link 1] ## templete类型迭代 ## ### 对templete类型迭代时报错 ### c++vector<T>:iterator it出错 error: need ‘typename’ before ‘std::set<T>::iterator’ because ‘std::set<T>’ is a dependent scope 解决:根据提示,也就是在set<T>::iterator it;之前应该加上typename。 typename set<T>::iterator it; for (it = node_set.begin(); it != node_set.end(); it++)// 入度全部初始化为0 原因说明是: 1、首先类除了可以定义数据成员或函数成员之外,还可以定义类型成员。 2、使用std::vector<T>::const\_iterator时,编译器假定这样的名字指定的是数据成员,而不是数据类型。 3、如果希望编译器将const\_iterator当做类型,则必须显示告诉编译器这样做,这就是我们加typename的原因。 \[ [c++ vector<T>::const\_iterator报错][c_ vector_T_const_iterator]\] from: [http://blog.csdn.net/pipisorry/article/details/72353250][blog.csdn.net_pipisorry_article_details_72353250] ref: \[[C++模板:函数模板和模板函数 ][C_] \] \[[C++ 模板详解(一)][C_ 1]\] [blog.csdn.net_pipisorry_article_details_72353250]: http://blog.csdn.net/pipisorry/article/details/72353250 [Link 1]: http://blog.csdn.net/pipisorry [c_ vector_T_const_iterator]: http://www.tc5u.com/cpp/2451731.htm [C_]: http://blog.csdn.net/beyondhaven/article/details/4204345 [C_ 1]: http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html
相关 C++ 模板 C++入门系列文章: [C++、STL常用容器][C_STL] [C++、STL – 函数对象、常用算法][C_STL _] 前言: > 学习模板并不是为了写模板,而 冷不防/ 2024年03月25日 12:45/ 0 赞/ 78 阅读
相关 C++模板 C++模板 1. 模板概念 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 客官°小女子只卖身不卖艺/ 2023年09月28日 12:09/ 0 赞/ 20 阅读
相关 C++模板 1. 为什么要使用模板? 1. 假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数: ![format_png][] 2. 这些函数 怼烎@/ 2023年05月31日 06:56/ 0 赞/ 17 阅读
相关 C++ 模板: 函数模板 文章目录 C++ 模板 函数模板 1. 模板的概念 2. 函数模板 2.1 函数模板语法 2.2 秒速五厘米/ 2022年12月30日 12:55/ 0 赞/ 274 阅读
相关 C++模板 函数模板 函数模板,是可以创建一个通用的函数,可以支持多种形参。 用关键字 `template` 来定义, 在函数模板中,数据的值和类型都被参数化了,发生函数调用时编 你的名字/ 2022年12月23日 00:43/ 0 赞/ 125 阅读
相关 C++模板 C++模板 ①模板是实现代码重用机制的一种工具。就是根据参数类型生成函数和类的机制。它可以分成两类:一是函数模板,二是类模板,他们允许用户构造模板函数,模板类。 也可称通用 谁借莪1个温暖的怀抱¢/ 2022年09月17日 11:20/ 0 赞/ 149 阅读
相关 c++模板 1定义函数模板 include<stdexcept> include <sstream> include <map> using namesp 水深无声/ 2022年08月21日 08:55/ 0 赞/ 167 阅读
相关 C++:模板 http://[blog.csdn.net/pipisorry/article/details/72353250][blog.csdn.net_pipisorry_articl 逃离我推掉我的手/ 2022年06月16日 13:59/ 0 赞/ 199 阅读
相关 c++模板 1.类模板及其(全)特化和偏特化 模板特化是通过"给模板中的所有模板参数一个具体的类"的方式来实现的.而模板偏特化则是通过"给模板中的部分模板参数以具体的类,而留下剩余的模板 红太狼/ 2022年05月17日 03:49/ 0 赞/ 160 阅读
相关 C++模板 文一:[/images/20220319/2dfa5cca396940129714244edcacafad.png][http_www.cnblogs.com_CaiNiaoZ Bertha 。/ 2022年03月19日 13:30/ 0 赞/ 243 阅读
还没有评论,来说两句吧...