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
小山日志 阅读(850)
评论(0) 编辑 收藏 引用 所属分类:
stl/boost/loki/generically