Effective C++ Item 45 运用成员函数模板接收所有兼容类型

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:请使用 member function templates(成员函数模板)生成"可接受所有兼容类型"的函数

示例:泛化 copy 构造函数

temmplate<typename T>
class SmartPtr{
public:
	template<typename U>
	SmartPtr(const SmartPtr<U> &other) //member template, 为了生成 copy 构造函数
		: heldPtr(other.get()){...}
	T *get() const {return heldPtr;}
	//...
private:
	T *heldPtr; //这个 SmartPtr 持有的内置指针
};

解析:

1.上面代码的意思是,对任何类型 T 和任何类型 U,这里可以根据 SmartPtr<U> 生成一个 SmartPtr<T>

2.未声明为 explicit 是因为原始指针类型之间的转换也是隐式转换的。

3.初始化 this 的 heldPtr 时只有在 U* 可以隐式转换为 T* 才能通过编译

经验:如果你声明 member templates 用于"泛化copy构造"或"泛化assignment操作",你还是需要声明正常的copy 构造函数和 copy assignment 操作符

示例:

template<class T>
class shared_ptr{
public:
	shared_ptr(shared_ptr const &r); //copy 构造函数
	template<class Y> //泛化 copy 构造函数
		shared_ptr(shared_ptr<Y> const &r);
	shared_ptr &operator=(shared_ptr const &r); //copy assignment
	temmplate<class Y> //泛化 copy assignment
		shared_ptr &operator=(shared_ptr<Y> const &r);
};

解析:member templates 并不改变语言规则,而语言规则说,如果程序需要一个 copy 构造函数,你却没有声明它,编译器会为你暗自生成一个

Effective C++ Item 45 运用成员函数模板接收所有兼容类型

时间: 2024-10-09 09:43:22

Effective C++ Item 45 运用成员函数模板接收所有兼容类型的相关文章

Effective C++ 条款45 运用成员函数模板接受所有兼容类型

1. "智能指针"是行为像指针的对象,但它们能提供指针没有的功能:shared_ptr,weak_ptr,auto_ptr(见条款13)实现对堆内存的自动管理,STL的迭代器实现对整个容器的遍历等. 真正的指针的优势在于支持继承层次中派生类指针向基类指针的转换(当然标准库shared_ptr,weak_ptr,auto_ptr等已实现). 2. 由于同一template的不同具现体之间没有直接联系,也就是说对于自定义的智能指针(假设名为SmartPtr),如果不额外采取手段支持基层层次

读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”

智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是智能指针:当然,你不能通过使用“++”来将链表中的指向一个节点的内建指针移到下一个节点上去,但是list::iterator可以这么做. 1. 问题分析——如何实现智能指针的隐式转换 真正的指针能够做好的一件事情是支持隐式转换.派生类指针可以隐式转换为基类指针,指向非const的指针可以隐式转换成为

Effective C++ Item 35 考虑 virtual 函数以外的实现

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.virtual 函数版本 class GameCharacter{ public: virtual int healthValue() const; //返回人物的健康指数, derived classes 可重新定义它 }; 2.使用 non-virtual interface 手法,那是 Template Method 设计模式的一种特殊形式. 让客户通过 public non-v

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

条款45:运用成员函数模板结合艘所有的兼容类型

首先看看下面的真实的指针与模板创建的智能指针之间的区别: 1 class Top{...}; 2 class Middle : public Top{...}; 3 class Bottom : public Middle{...}; 4 Top * p1 = new Bottom(); 5 Top * p2 = new Middle(); 6 const Top * cp2 = p1; //ok,没有问题,指针与实际所指之物之间确实是有关系的 但是: 1 template<typename T

读书笔记 effective c++ Item 35 考虑虚函数的替代者

1. 突破思维——不要将思维限定在面向对象方法上 你正在制作一个视频游戏,你正在为游戏中的人物设计一个类继承体系.你的游戏处在农耕时代,人类很容易受伤或者说健康度降低.因此你决定为其提供一个成员函数,healthValue,返回一个整型值来表明一个人物的健康度.因为不同的人物会用不同的方式来计算健康度,将healthValue声明为虚函数看上去是一个比较明显的设计方式: 1 class GameCharacter { 2 public: 3 4 virtual int healthValue()

C++程序设计方法4:成员函数模板

成员函数的模板: 普通类的成员函数,也可以定义为函数模板,如: class normal_class { public: int value; template<typename T> void set(T const &v) { value = int(v);//在类内定义 } template<typename T> T get(); }; template<typename T> T normal_class::get() {return T(value)

Effective STL: 尽量使用区间成员函数代替它们的单元素兄弟

尽量使用区间成员函数代替它们的单元素兄弟的理由 一般来说使用区间成员函数可以输入更少的代码. 区间成员函数会导致代码更清晰更直接了当. 当处理标准序列容器时,应用单元素成员函数比完成同样目的的区间成员函数需要更多地内存分配,更频繁地拷贝对象,而且/或者造成多余操作. // 把一个int数组拷贝到vector前端 int data[numValues]; // 假设numValues在其他地方定义vector<int> v; ... // 区间成员函数版本 v.insert(v.begin(),

C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put.如:    cout.put('a');调用该函数的结果是在屏幕上显示一个字符a.put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式).如    cout.put(65 + 32);也显示字符a,因为97是字符a的ASCII代码. 可以