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
小山日志 閱讀(873)
評論(0) 編輯 收藏 引用 所屬分類:
stl/boost/loki/generically