C++箴言:用成员函数模板接受兼容类型

smart pointers(智能指针)是行为很像指针但是增加了指针没有提供的功能的 objects。例如,《C++箴言:使用对象管理资源》阐述了标准 auto_ptr 和 tr1::shared_ptr 是怎样被应用于在恰当的时间自动删除的 heap-based resources(基于堆的资源)的。STL containers 内的 iterators(迭代器)几乎始终是 smart pointers(智能指针);你绝对不能指望用 "++" 将一个 built-in pointer(内建指针)从一个 linked list(线性链表)的一个节点移动到下一个,但是 list::iterators 可以做到。

real pointers(真正的指针)做得很好的一件事是支持 implicit conversions(隐式转换)。derived class pointers(派生类指针)隐式转换到 base class pointers(基类指针),pointers to non-const objects(指向非常量对象的指针)转换到 pointers to const objects(指向常量对象的指针),等等。例如,考虑在一个 three-level hierarchy(三层继承体系)中能发生的一些转换:

class Top { ... };
class Middle: public Top { ... };
class Bottom: public Middle { ... };
Top *pt1 = new Middle; // convert Middle* => Top*
Top *pt2 = new Bottom; // convert Bottom* => Top*
const Top *pct2 = pt1; // convert Top* => const Top*


在 user-defined smart pointer classes(用户定义智能指针类)中模仿这些转换是需要技巧的。我们要让下面的代码能够编译:

template<typename T>
class SmartPtr {
 public: // smart pointers are typically
  explicit SmartPtr(T *realPtr); // initialized by built-in pointers
 ...
};
SmartPtr<Top> pt1 = // convert SmartPtr<Middle> =>
SmartPtr<Middle>(new Middle); // SmartPtr<Top>
SmartPtr<Top> pt2 = // convert SmartPtr<Bottom> =>
SmartPtr<Bottom>(new Bottom); // SmartPtr<Top>
SmartPtr<const Top> pct2 = pt1; // convert SmartPtr<Top> =>
// SmartPtr<const Top>


在同一个 template(模板)的不同 instantiations(实例化)之间没有 inherent relationship(继承关系),所以编译器认为 SmartPtr<Middle> 和 SmartPtr<Top> 是完全不同的 classes,并不比(比方说)vector<float> 和 Widget 的关系更近。为了得到我们想要的在 SmartPtr classes 之间的转换,我们必须显式地为它们编程。

时间: 2024-08-30 06:02:02

C++箴言:用成员函数模板接受兼容类型的相关文章

C++:模板类使用成员函数模板处理隐式(implicit)转换

指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针可以转换为基类指针. 但是模板的实例化(instantiations)之间, 是单独存在的, 派生类的实例化的模板(SmartPtr<Derived>), 不能转换为基类实例化的模板(SmartPtr<Base>); 需要明确的编写, 因为派生类也可以继续做为基类, 产生派生类, 所以无法直接写出构造函数. 使用成员函数模板(member function template), 再声明一个模板参数

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

(一〇六)函数模板

函数模板的意义在于,可以在不同的参数下,起到同样的作用. 按照教程所说,它们使用泛型来定义函数,其中泛型可用具体的类型(如int.double)替换.通过将类型作为参数传递给模板,可使编译器生成该类型的函数.   由于模板允许以泛型(而不是具体的类型)的方式编写程序,因此在有时也会被称为是通用编程.   由于类型是用参数表示的,因此模板特性有时也被称为参数化类型.   格式: template <typename xx> void 函数名(xx &a, xx &b) { xx

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据

 1.函数模板初级,如果想使用模板,需要实例化,实例化的方式是加上<数据类型> #include <iostream>   //函数模板可以对类型进行优化重载,根据类型会覆盖 //如果仍然要使用模板函数,需要实例化   template<class T> T add(T a, T b) {     std::cout << "T add " << std::endl;     return a + b; }   int a

C++函数模板

函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,也就是说,函数模板代表一个函数家族,这些函数的元素是未定的,在使用的时候被参数化. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-template.html,转载请注明源地址. 下面举一个简单的例子: 定义模板: template<typename T> inline T const& max(T const& a, T const& b) { return

实例解析C++中类的成员函数指针_C 语言

C语言的指针相当的灵活方便,但也相当容易出错.许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下.但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序. 然而C++的指针却常常给我一种束手束脚的感觉.C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查.因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换.而且这些指针的声明格式都不一样:

C++中成员函数(member function)模板(template) 详解

成员模板(member template) 既可以在普通类(ordinary class), 也可以在类模板(class template); 在普通类中, 在使用成员函数时, 不用提供模板参数, 函数可以根据使用的参数, 自动推导(deduce)模板实参(template argument)对应模板形参(template parameter); 在类模板中, 成员函数的模板参数(template parameter)可以和类的模板参数不同, 但在定义(definition)中, 必须添加两个模

成员函数指针与高性能的C++委托 (Member Function Pointers and the Fastest Possible C++ Delegates)

标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托(delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托"的概念日趋流行,这也正显示出C#这种语言的成功.在很多应用程序中,&qu

C++指向类成员函数的指针详细解析_C 语言

首先 函数指针是指向一组同类型的函数的指针:而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数.前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的. 函数指针实例: 复制代码 代码如下: typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int func(int x,int y){ printf("func:x=%d,y=%