Boost.Utility.

原文地址:http://blog.csdn.net/genius_hb/article/details/1479113


有些工具还不够组成它们自己的库,因此它们与其它实体被集合到一起,这就形成了 Boost.Utility .

简单介绍一下每一个工具.

第一个:编译期断言(静态断言)BOOST_STATIC_ASSERT.这个不用多说,就是用于编译时刻的断言.用法也简单:

BOOST_STATIC_ASSERT(sizeof(int) == 4);

当然,你可以在类作用域或函数作用域中使用它.有人可能想知道它的原理,看源码就知道了(通过名字知道应该是个宏):

template <bool x> struct STATIC_ASSERTION_FAILURE;

template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };

template<int x> struct static_assert_test{};

#define BOOST_STATIC_ASSERT( B ) /
   typedef ::boost::static_assert_test</
      sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)/
      > boost_static_assert_typedef_

道理很简单,如果B为假,那么sizeof (STATIC_ASSERTION_FAILURE)将不合法,因为STATIC_ASSERTION_FAILURE没有定义.只有一个参数为真的特化体.用了一个typedef包装,没有额外的负担.

这里补充一点:imperfect c++中提到了几种编译期断言的方式,都满足这个功能上的要求,但编译期断言的难点在于如何提供较好的错误信息.简单介绍一下常见的几种编译期断言的原理:

1.不能定义一个大小为0的数组

2.枚举中不能出现相同的值

3.switch中不能出现相同的值

4.位域中不能指定长度为0的段

等等一些都可以用来做编译期的断言.

第二个:checked_delete.这是由于一个经常被一般程序员忽略的问题

c++标准:如果你试图删除一个指针,而该指针指向的是一个带有非平凡(non-trivial)析构函数的不完整(incomplete)类型,结果将是未定义的行为.

这个问题出现几率不大,但在使用向auto_ptr,或者编写auto_ptr这类模板时却很容易发生,在模板的实例化点,如果模板实参类型是一个incomplete类型,对于auto_ptr的使用是没有任何问题的,但在auto_ptr销毁时行为却是未定义的.至少在大部分编译器下析构函数没有被调用,并且是没有任何警告和错误提示的.

于是boost中出现了这样一个工具,用于删除一个指针所指对象,当这个对象的类型不完整时会有一个静态断言的失败.这样你就可以发现自己程序中哪些地方会有隐含的问题.源码如下:

template<class T> inline void checked_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}

关于这个有点说明,那个typedef中sizeof(T),有的书上说如果T为不完全类,那么sizeof(T)会返回0,而有的编译器是给一个错误.这样当sizeof(T)为0时,就定义了一个[-1]大小的数组,这绝对是个错误,下面那句有什么用呢?我猜测,可能是担心某些编译器会把上面那句没用的typedef给优化掉,所以多做了一个保证.

第三个:nocopyable.这个不用说,没什么意义.

class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      const noncopyable& operator=( const noncopyable& );
  };

第四个:addressof 先看源码:

template <typename T> T*
addressof(T& v)
{
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}

这些转换有什么意思不太清楚,但应该是符合c++标准的.功能很简单,用处在哪呢??在写一个模板时,不能确定参数类型是否重载了operator &,而你又需要该类对象的地址,这样addressof就派上用场了.

第五个:enable_if这个不想说,太复杂.主要是和函数重载决议有关,这个话题太过复杂,也没太多实际意义,以后有机会在专门写一个关于这个的.

这几天比较忙,少写点了...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值