快速业务通道

《深度探索C++对象模型》读书笔记(7)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

***Template的“具现”行为***

template class中的任何member都只能通过template class的某个实体来存取或操作。

Point<float>::Status s;  // ok
Point::Status s;  // error

如果我们定义一个指针,指向特定的实体,像这样:

Point<float> *ptr = 0;

由于这是一个指向class object的指针,本身并不是一个class object,编译器不需要知道与该class有关的任何members数据。所以将“Point的一个float实体”具现也就没有必要。

如果不是一个pointer而是reference ,假设:

Point<float> &ref = 0;

这个定义的真正语意会被扩 展为:

// 内部扩展
Point<float> temp(float(0));
Point<float> &ref = temp;

以上转化是因为reference并不是无物(no object)的代名词,0被视作整数,必须被转换为类型Point<float>的一个对象。

然而, member functions只有在member functions被使用的时候,C++ Standard才要求它们被“具现 ”出来。这个规则的由来主要有两个原因:

(1)空间和效率的考虑。对于未使用的函数进 行“具现”将会花费大量的时间和空间;

(2)尚未实现的功能。并不是一个 template具现出来的所有类型一定能够完整支持一组member functions,因而只需具现真正需要的 member functions.

举个例子:

Point<float> *p = new Point<float>;

只有(a)Point template的float实例、(b)new 运算符、(c) default constructor需要被“具现”。

***Template的错误报告***

所有与类 型相关的检验,如果涉及到template参数,都必须延迟到真正的具现操作发生。

对于下面的 template声明:

template <class T>
class Mumble
{
public:
Mumble(T t = 1024) : _t(t)
{
if(tt != t)
throw ex ex;
}
private:
T tt;
}

其中像“T t = 1024”、“tt != t”这样的潜在错误在template声明时并不会报告,而会在每个具现操作发生时被检查出来并记录 之,其结果将因不同的实际类型而不同。

Mumble<int> mi;  // 上述两个潜在错 误都不存在
Mumble<int*> pmi;  // 由于不能将一个非零的整数常量指定给一个指针,故 “T t = 1024”错误

***Template中的名称决议方式***

区分以下两种 意义:一种是“scope of the template definition”,也就是“定义出 template”的程序,另一种是“scope of the template instantiation”,也就是 “具现出template”的程序。

// scope of the template definition
extern double foo(double);

template <class type>
class ScopeRules
.{
public:
void invariant() { _member = foo(_val); }
type type_dependent() { return foo(_member); }
// ...
private:
int _val;
type _member;
};

// scope of the template instantiation
extern int foo(int);

ScopeRules<int> sr0;

在“scope of the template definition”中,只有一个foo()函数声明位于scope之内;然而在“scope of the template instantiation”中,两个foo()函数声明都位于scope之内。对于以下函数操作:

// scope of the template instantiation
sr0.invariant();

那么 ,在invariant()中调用的究竟是哪一个foo()函数实体呢?

Template之中,对于一个 nonmember name的决议结果是根据这个name的使用是否与“用以具现出该template的参数类型 ”有关而决定的,如果其使用互不相关,那么就以“scope of the template definition”来决定name,否则就以“scop

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号