小山日志
读书,学习与思考.
posts - 9,comments - 14,trackbacks - 0

2. 函数模板 checked_delete() checked_array_delete()

<boost/checked_delete.hpp> 定义了两个函数模板 checked_delete checked_array_delete 还有两个类模板 checked_deleter checked_array_deleter。

当我们利用指针删除一个对象的时候,对象类型是否完整决定了对象是否能够被正确删除。但是,如果你用 delete 去删除一个类型并不完整的对象的指针,编译器并不会给你提供任何错误信息(好吧,有些编译器会给出警告信息,但是程序员通常会忽略警告信息),但是这样做的结果却是对象的析构函数根本就没有被调用。

所以,我们应当使用更严厉的手段禁止这种事情的发生。比如说使用 checked_delete 代替 delete 来删除指针。当指针所指向的是一个不完全类型时, checked_delete 会使编译器发出错误信息。

class  test; // 有声明,但是忘记了定义,或是忘记    
          
// 包含定义文件,test是一个不完全类型

main()
{
test 
*  pt  =  NULL;
delete pt;  
//
 有时会有警告信息,
            
// 但有时什么都没有。

checked_delete(pt);  //  发出错误信息。
}

checked_array_delete 是用来对应于 delete [ ] operator checked_deleter checked_array_deleter 是可以配接的仿函数版本。

3. 函数模板 next() prior()
包括

template < class T > T next(T x);
template
< class T, class  Distance >
T next(T x, Distance n);
template
< class T >
T prior(T x);
template
< class T, class  Distance >
T prior(T x, Distance n);

函数模板对传入的指针,智能指针或是迭代器做递增或递减,并传回它。用法如下:

const  std::list < T > ::iterator p  =  get_some_iterator();
const  std::list < T > ::iterator prev  =
 boost::prior(p);
const  std::list < T > ::iterator next  =  boost::next(prev,  2 );

事实上, T next(T x) T prior(T x) 将分别调用 operator++ operator-- ,而 T next(T x, Distance n) T prior(T x, Distance n) 则调用 std::distance(T x, size_t n)

4.noncopyable

如果你需要设计一个不可以被复制的类,那么你就要明确地将它的拷贝构造函数和 operator = () 放到 private 声明下面。 Boos\utility 准备了一个基类 noncopyable ,你只需要让你的类继承自 noncopyable 就可以获得这个性质。对你的类来说这也是一个显式的声明:“我是不可以被复制的!”
用法:

#include  < boost / utility.hpp >

class
 ResourceLadenFileSystem : boost::noncopyable {


5 .函数模板 addressof()

函数模板返回一个对象的真实地址(当然这是交给指针了):

template < typename T > inline T *                 addressof(T &  v);
template
< typename T > inline const  T *          addressof( const  T &
 v);
template
< typename T > inline volatile  T *       addressof( volatile  T &
 v);
template
< typename T > inline const volatile T *  addressof( const volatile T & v);

我知道你想说,为什么不是简单的调用operator&()。因为c++允许重载operator&(),所以有时使用它获得的并不是对象的真实地址,而是编写重载operator&()代码的作者希望给你的那个。如果你却是希望获得的是这个对象的地址,使用addressof():

#include <boost/utility.hpp>
struct useless_type {};

class
 nonaddressable {
  useless_type 
operator&() const
;
};

void
 f() {
  nonaddressable x;
  nonaddressable
* xp =
 boost::addressof(x);
  
// nonaddressable* xpe = &x; //
error! operator&()已经被重载,
                              
//它返回的是useless_type的指针
}




上述的所有东西都可以简单的通过在你的源文件开头处写上:
#include <boost\utility.hpp>
using namespace boost;
就可以使用了。当然我是指你机器上已经有boost这个奇妙的库,并且正确配置^_^
posted on 2006-08-16 00:24 小山日志 阅读(839) 评论(0)  编辑 收藏 引用 所属分类: stl/boost/loki/generically

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理