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