C++模板
来源:互联网 发布:Os软件 编辑:程序博客网 时间:2024/05/14 04:22
原来...C++ template1.自定义Stack模板类#include <vector>#include <stdexcept>template <typename T>class Stack { private: std::vector<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};template <typename T>void Stack<T>::push (T const& elem){ elems.push_back(elem); // append copy of passed elem}template<typename T>void Stack<T>::pop (){ if (elems.empty()) { throw std::out_of_range("Stack<>::pop(): empty stack"); } elems.pop_back(); // remove last element}template <typename T>T Stack<T>::top () const{ if (elems.empty()) { throw std::out_of_range("Stack<>::top(): empty stack"); } return elems.back(); // return copy of last element}测试#include <iostream>#include <string>#include <cstdlib>#include "stack1.hpp"int main(){ try { Stack<int> intStack; // stack of ints Stack<std::string> stringStack; // stack of strings // manipulate int stack intStack.push(7); std::cout << intStack.top() << std::endl; // manipulate string stack stringStack.push("hello"); std::cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (std::exception const& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; // exit program with ERROR status }}由于多掉了一次pop所以报错2.用typdef产生一个特定模板类别名比如Stack<int>typedef Stack<int> IntStack;int main(){ IntStack intStack; intStack.push(7); std::cout << intStack.top() << std::endl;}3.模板类的特化#include <deque>#include <string>#include <stdexcept>#include "stack1.hpp"template<>class Stack<std::string> { private: std::deque<std::string> elems; // elements public: void push(std::string const&); // push element void pop(); // pop element std::string top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};void Stack<std::string>::push (std::string const& elem){ elems.push_back(elem); // append copy of passed elem}void Stack<std::string>::pop (){ if (elems.empty()) { throw std::out_of_range ("Stack<std::string>::pop(): empty stack"); } elems.pop_back(); // remove last element}std::string Stack<std::string>::top () const{ if (elems.empty()) { throw std::out_of_range ("Stack<std::string>::top(): empty stack"); } return elems.back(); // return copy of last element}基于模板类之上,对于特定类型进行重新实现,比如上面就是一个对std:: string的特例实现,内部用deque实现测试#include <iostream>#include <string>#include <cstdlib>#include "stack2.hpp"int main(){ try { Stack<int> intStack; // stack of ints Stack<std::string> stringStack; // stack of strings // manipulate int stack intStack.push(7); std::cout << intStack.top() << std::endl; intStack.pop(); // manipulate string stack stringStack.push("hello"); std::cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (std::exception const& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; // exit program with ERROR status }}上面Stack<std::string>使用了特化的类4.局部特化若模板类有两个参数,那么确定其中一个参数,另一个未确定的话,则可以说是局部特化template <typename T1, typename T2>class MyClass {...};//偏特化:两个template parameter相同template <typename T>class MyClass<T, T> {...};//偏特化:第二个参数为inttemplate <typename T>class MyClass<T, int> {...};这些概念与c#的泛型是相同的.5.预设模板与局部特化概念差不多,但保留了参数,给参数设置了一个默认的类型#include <vector>#include <stdexcept>template <typename T, typename CONT = std::vector<T> >class Stack { private: CONT elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};template <typename T, typename CONT>void Stack<T,CONT>::push (T const& elem){ elems.push_back(elem); // append copy of passed elem}template <typename T, typename CONT>void Stack<T,CONT>::pop (){ if (elems.empty()) { throw std::out_of_range("Stack<>::pop(): empty stack"); } elems.pop_back(); // remove last element}template <typename T, typename CONT>T Stack<T,CONT>::top () const{ if (elems.empty()) { throw std::out_of_range("Stack<>::top(): empty stack"); } return elems.back(); // return copy of last element}示例:这样如果用默认的类型,就可以少指定一个模板类的类型#include <iostream>#include <deque>#include <cstdlib>#include "stack3.hpp"int main(){ try { // stack of ints: Stack<int> intStack; // stack of doubles which uses a std::deque<> to manage the elements Stack<double,std::deque<double> > dblStack; // manipulate int stack intStack.push(7); std::cout << intStack.top() << std::endl; intStack.pop(); // manipulate double stack dblStack.push(42.42); std::cout << dblStack.top() << std::endl; dblStack.pop(); dblStack.pop(); } catch (std::exception const& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; // exit program with ERROR status }}
0 0
- C++-模板
- C++-模板
- C++:模板
- C++:模板
- C++:模板
- 模板 (C++)
- C ++ 模板
- C ++ 模板
- 【C++】模板
- c++----------模板
- C++--------------------------------------------模板
- c++--模板
- C++:模板
- 【基础C&C++】模板
- 【c/c++】类模板
- 【C/C++】模板类
- 【c++】模板和模板类
- C/C++:函数模板与类模板
- ios中单例模式的一点理解
- PNG-24和PNG-8
- 阿里妈妈还是阿里后妈
- PC机与多个单片机间的通信
- 【OpenCV学习笔记】【函数学习】八(序列数据结构)
- C++模板
- 使用iptables保障Linux服务器
- 2440的串口发送中断的总结
- java执行shell命令或者脚本,返回结果到程序
- WebService<一>
- HashMap实现原理
- 线程的(同步synchronized)控制
- static inline
- linux 禁止修改和删除文件i18n