WEB开发网
开发学院软件开发VC 模板友元化 阅读

模板友元化

 2007-03-16 21:57:45 来源:WEB开发网   
核心提示: 2、#3处于一种颠簸(edgy)的状态,很容易被阅读你代码的人破坏(fragile),模板友元化(4),而且令她感到惊讶,例如,比较我们的结果,如果你曾经看过电视节目"家族分歧"(Family Feud),考虑如下细微的变化――我所做的只是去掉了限定域boost::,/

2、#3处于一种颠簸(edgy)的状态,很容易被阅读你代码的人破坏(fragile),而且令她感到惊讶。

例如,考虑如下细微的变化――我所做的只是去掉了限定域boost::。

// 变化:去掉该名字的限定域,
// 这意味着产生了很大的变化。
class Test {
 ~Test() { }
 friend void checked_delete( Test* x );
};   

如果你忽略了boost::(例如,如果该调用是无限定域的),那么你其实是使用了#4,它根本就不包含函数模板,尽管它看起来优雅且简练。我敢和你用打赌买根"老高太太糖葫芦"(译者:donuts,面包圈,不可以随便译么?^_^),我认为我们这个美丽行星上的每个人都会同意我的看法——只忽略了命名空间的名字却如此剧烈的改变了友元声明的含义——这是非常不合理的。让我们必避免这种颠簸的构造吧。

3、#3处于一种颠簸(edgy)的状态,很容易被分析你代码的编译器破坏(fragile),而且令她感到惊讶。

让我们分别用#1和#3来看看现在的编译器都是怎么想的吧。编译器对C++标准的理解会和我们一样么?是不是至少会有些最健壮的编译器会如我们所期待的那样工作呢?不,不是这样的。

让我们首先试试#3吧:

// 再来看看例1
namespace boost {
 template<typename T> void checked_delete( T* x ) {
  // ... 其它代码 ...
  delete x;
 }
}
class Test {
 ~Test() { }
 friend void boost::checked_delete( Test* x ); // 原始代码
};
int main() {
 boost::checked_delete( new Test );
}   

在你自己的编译器上试试看,比较我们的结果。如果你曾经看过电视节目"家族分歧"(Family Feud),你现在可能会想象得到Richard Dawsond的名言了:"Survey Saaaaays"(译者:横向比较?原文就是那么多个a呀:)(见表1)。

上一页  1 2 3 4 5 6  下一页

Tags:模板 元化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接