类模板

 #include<iostream>
#include<vector>
#include<memory>
using namespace std; template <typename T> class BlobPtr;
template <typename T> class Blob;
template <typename T> bool operator==(const Blob<T>&, const Blob<T>&); template<typename T> class Blob {
friend class BlboPtr;
friend bool operator==(const Blob<T>&, const Blob<T>&);
public:
typedef typename vector<T>::size_type size_type; Blob();
Blob(initializer_list<T> il); size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
void push_back(const T&) { data->push(t); }
void push_back(T &&t) { data->push_back(std::move(t)); } void pop_back();
T& back();
T& opearator[](size_type i); private:
shared_ptr<vector<T>> data;
void check(size_t i, const string &msg)
}; template <typename T>
Blob<T>::Blob(): data(make_shared<vector<T>>()) {} template <typename T>
Blob<T>::Blob(initializer_list<T> il): data(make_shared<vector<T>>(il)) {} temlate <typename T>
void Blob<T>::check(size_type i, const string &msg) const
{
if (i >= data->size())
throw out_of_range(msg);
}
template <typename T>
void Blob<T>::pop_back()
{
check(, "pop_back on empty Blob");
data->pop_back();
} template <typename T>
T& Blob<T>::back()
{
check(, "back om empty Blob");
return data->back();
} template <typename T>
T& operator[](size_type i)
{
check(i,"subscript out of range");
return (*data)[i];
} /*--------------------------BlobPtr----------------------------------------------*/ template <typename T> BlobPtr {
public:
BlobPtr(): curr() {}
BlobPtr(Blob<T> &a, size_r sz = ): wptr(a.data), curr(sz) {} T& opearator*() const; BlobPtr& operator++(); //后缀自增
BlobPtr& opearator--();
BlobPtr& opearator++(int); //前缀自减
BlobPtr& opearator--(int); private:
size_t curr;
weak_ptr<vector<T>> wptr;
shared_ptr<vector<T>> check(size_t, const string&) const
}; template <typename T>
shared_ptr<vector<T>> BlobPtr<T>::check(size_t i, const string &msg) const
{
auto ret = wptr.lock();
if (!ret)
throw runtime_error("unbind BlobPtr");
if (i >= ret->size())
thow out_of_range(msg);
} template <typename T>
T& BlobPtr*() const
{
auto p = check(curr, "dereference past end");
return (*p)[curr];
} template <typename T>
BlobPtr<T>& BlobPtr<T>::operator--()
{
--curr;
check(curr, "decrement past bengin of BlobPtr");
return *this;
} template <typename T>
BlobPtr<T>& BlobPtr<T>::opearator++()
{
check(curr, "unbound BlobPtr");
++curr;
return *this;
} template <typename T>
BlobPtr<T>& BlobPtr<T>::operator++(int) //后缀
{
BlobPtr ret = *this;
++*this;
return ret;
} template <typename T>
BlobPtr<T>& BlobPtr<T>::operator--(int)
{
BlobPtr ret = *this;
--*this;
return ret;
}
 template <typename T> class Pal;    // 前置申明,在将模板的一个特例声明为友元关系时要用到
class C { // C是一个普通的非模板类
friend class Pal<C>; // 用C实例化的Pal是C的一个友元 template <typename T> friend class Pal2; // pal2的所有实例都是C的友元;这种情况无需前置申明
}; template <typename T> class C2 { // C2本身是一个类模板
friend class Pal<T>; // C2的每个实例将相同实例化的Pal声明为友元
template <typename X> friend class Pal2; // Pal2的所有实例都是C2的每个实例的友元,不需要前置声明
friend class Pal3; // pal3是一个非模板类,它是C2所有实例的友元
// 不需要Pal3的前置声明
};

控制实例化

• 模板在使用时才会被实例化,相同的实例可能出现在对各对象文件中。

• 当多个独立编译的源文件使用了相同的模板,并提供了相同的参数。那么每个文件都会有该模板的一个实例,在大系统中,这会增加额外开销。

• 通过显示实例化,避免这种开销。

extern template class Blob<string>             //声明
template int compare(const int&, const int&) //定义

最新文章

  1. 剑指Offer面试题:24.复杂链表的复制
  2. 《R in Action》读书笔记(1)
  3. WebGIS开源方案中空间数据的入库、编辑、发布的操作流程
  4. Dom4j操作XML文件
  5. spring+IOC+DI+AOP优点分析(一)
  6. 安装 SSL 证书
  7. GIT之旅【第一篇】
  8. 移动Web开发图片自适应两种常见情况解决方案
  9. C++中不同变量、函数在内存中的内存情况《转》
  10. obj-c编程05:类的多态与id动态绑定
  11. 关于setInterval返回值问题
  12. FatFs文件系统的移植
  13. Docker容器学习梳理 - 基础环境安装
  14. 干货:制作科研slide简明规范
  15. iOS News Reader开源项目
  16. mxGraph画图区域使用鼠标滚轮实现放大/缩小
  17. 每天一个linux命令:【转载】cd命令
  18. JavaScript手绘风格的图形库RoughJS使用指南
  19. 详解React的生命周期
  20. 质问微软 WP8.1开发HTTPS 真费劲

热门文章

  1. CentOS6.8下MySQL数据库忘记root密码解决方法
  2. 任意两点间的最短路问题(Floyd-Warshall算法)
  3. Java实现DOS中的Copy命令
  4. Easyui comboxgrid弹出窗增加搜索功能
  5. MongoDB 时差问题问题
  6. js 判断身份证好是否合法
  7. C# 对List中的Object进行排序
  8. swift 计算100000以内的 回文数
  9. java中的基本数据类型一定存储在栈中吗?
  10. pl/sql Devloper 关键字转为大写