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

模板友元化

 2007-03-16 21:57:45 来源:WEB开发网   
核心提示:摘要:如何将一个函数模板的特化声明为友元呢?标准C++给你提供了两种合法的语法,然而,模板友元化,事实上,对于其中的一种语法,它们的语法很平凡且不会使人困惑,坏消息:没有哪一种编译器对这两种标准语法提供完全的支持,几乎没有编译器对其给予支持;而对于另一种,当前所有主流编译器(除了一款以外)都对其提供了支持

摘要:

如何将一个函数模板的特化声明为友元呢?标准C++给你提供了两种合法的语法。然而,事实上,对于其中的一种语法,几乎没有编译器对其给予支持;而对于另一种,当前所有主流编译器(除了一款以外)都对其提供了支持。

假设我们有一个函数模板,可以调用其所操作的对象的SomethingPrivate()方法。特别地,考虑boost::checked_delete()函数模板,它用以删除指定的对象——在它的实现中,会调用该对象的析构函数:

namespace boost {
 template<typename T> void checked_delete( T* x ) {
  // ... 其它代码 ...
  delete x;
 }
}   

现在,假设你想要在一个类中使用该函数模板,则该类中只有一个私有的方法(析构函数):

class Test {
 ~Test() { }        // 私有的!
};
Test* t = new Test;
boost::checked_delete( t ); // 错误:
// Test 的析构函数是私有的,
// 因此checked_delete不能调用它。   

解决方案很简单:只要令checked_delete()成为Test的友元即可。(其它的方法都需要Test提供公共的析构函数)如何才能实现这个容易的解决方案呢?事实上, C++标准提供了2种方法来合法又便捷的实现它。

本文将提供一个现实的检验:在某个命名空间中,友元化一个模板――说起来容易做起来难!(现实的编译器并未对标准有完好的支持。)

总体来说,我有以下几条好消息和坏消息:

好消息:存在两种对其支持得很好的符合标准的方法,它们的语法很平凡且不会使人困惑。

坏消息:没有哪一种编译器对这两种标准语法提供完全的支持。甚至一些最健壮且几乎完全实现了C++标准的编译器都不能对它们两个或其中之一提供完好的支持。

1 2 3 4 5 6  下一页

Tags:模板 元化

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