2.
函數(shù)模板
checked_delete()
和
checked_array_delete()
<boost/checked_delete.hpp> 定義了兩個函數(shù)模板 checked_delete 和 checked_array_delete , 還有兩個類模板 checked_deleter 和 checked_array_deleter。
當我們利用指針刪除一個對象的時候,對象類型是否完整決定了對象是否能夠被正確刪除。但是,如果你用
delete
去刪除一個類型并不完整的對象的指針,編譯器并不會給你提供任何錯誤信息(好吧,有些編譯器會給出警告信息,但是程序員通常會忽略警告信息),但是這樣做的結果卻是對象的析構函數(shù)根本就沒有被調(diào)用。
所以,我們應當使用更嚴厲的手段禁止這種事情的發(fā)生。比如說使用
checked_delete
代替
delete
來刪除指針。當指針所指向的是一個不完全類型時,
checked_delete
會使編譯器發(fā)出錯誤信息。
?????????? // 包含定義文件,test是一個不完全類型
main()
{
test? * ?pt? = ?NULL;
delete?pt;?? // ?有時會有警告信息,
???????????? // 但有時什么都沒有。
checked_delete(pt);? // ?發(fā)出錯誤信息。
}
checked_array_delete 是用來對應于 delete [ ] operator , checked_deleter 和 checked_array_deleter 是可以配接的仿函數(shù)版本。
3.
函數(shù)模板
next()
和
prior()
包括
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);
函數(shù)模板對傳入的指針,智能指針或是迭代器做遞增或遞減,并傳回它。用法如下:
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) 將分別調(diào)用 operator++ 和 operator-- ,而 T next(T x, Distance n) 和 T prior(T x, Distance n) 則調(diào)用 std::distance(T x, size_t n) 。
4.noncopyable 類
如果你需要設計一個不可以被復制的類,那么你就要明確地將它的拷貝構造函數(shù)和
operator = ()
放到
private
聲明下面。
Boos\utility
準備了一個基類
noncopyable
,你只需要讓你的類繼承自
noncopyable
就可以獲得這個性質(zhì)。對你的類來說這也是一個顯式的聲明:“我是不可以被復制的!”
用法:
class ?ResourceLadenFileSystem?:?boost::noncopyable?{
5
.函數(shù)模板
addressof()
函數(shù)模板返回一個對象的真實地址(當然這是交給指針了):
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);
我知道你想說,為什么不是簡單的調(diào)用operator&()。因為c++允許重載operator&(),所以有時使用它獲得的并不是對象的真實地址,而是編寫重載operator&()代碼的作者希望給你的那個。如果你卻是希望獲得的是這個對象的地址,使用addressof():
struct?useless_type?{};
class?nonaddressable?{
??useless_type?operator&()?const;
};
void?f()?{
??nonaddressable?x;
??nonaddressable*?xp?=?boost::addressof(x);
??//?nonaddressable*?xpe?=?&x;?//error!?operator&()已經(jīng)被重載,
??????????????????????????????//它返回的是useless_type的指針
}
上述的所有東西都可以簡單的通過在你的源文件開頭處寫上:
using?namespace?boost;

