首页 > 代码库 > TR1内的组件--智能指针、function
TR1内的组件--智能指针、function
一、智能指针
tr1::shared_ptr和tr1::weak_ptr。前者的作用有如内置指针,但会记录有多少个tr::shared_ptrs共同指向同一个对象,这便是所谓的引用计数。一旦最后一个这样的指针被销毁,也就是一旦某一个对象的引用计数为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助,但如果两个或多个对象内含tr1::shared_ptrs并形成环状,这个环形会造成每个对象的应用计数都超过0--即使指向这个环形的所有指针都已被销毁(也就是这一群对象整体看来已无法触及)。这就是为什么又有个tr1::weak_ptrs的原因。tr1::weak_ptrs的设计使其表现象是“非环形tr1::shared_ptr-based数据结构”中形成感生指针。tr1::shared_ptr并不参与应用计数的计算,当最后一个指向某对象的tr1::shared_ptr被销毁,纵使还有个tr1::weak_ptrs继续指向同一个对象,该对象仍旧会被删除,这种情况下的tr1::weak_ptrs会被自动标示无效。
tr1::shared_ptr或许是拥有最广泛用途的TR1组件,
二、tr1::function
此物得以标示任何可调之物,也就是任何函数或者函数对象,只要其签名符合目标,假设我们想注册一个callback函数,该函数接受一个int并返回一个string,我们可以这么写:
void registerCallback(std::string func(int)); //参数类型是函数,该函数接受一个int并返回一个string
其中参数名称func可有可无,所以上述的registerCallback也可以这样声明:
void registerCallback(std::string (int));//与上同,参数名称略而未写,这一这里的"std::string (int)"是个函数签名。tr1::function使上述的registerCallback有可能更富弹性地接受任何可调用物,只有这个可调用物接受一个Int或任何可被转换为int的东西,并返回一个string或任何可被转换为string的东西,tr1::function是个template,以其目标函数的签名为参数,
void refisterCallback(std::tr1::function<std::string (int)> func);
//参数“func”接受任何可调用物 只要该“可调用物”的签名与"std::string (int)"一致
三、tr1::bind
它能够做STL绑定器bindlst和bind2nd所做的每一件是,而又更多,和前任绑定器不同的是,tr1::binf可以和const以及non-const成员函数协同运作,可以和by-reference参数协同运作,而且他不需特殊协助就可以处理函数指针,所以我们调用tr1::bind之前不必再被什么ptr_fun,mem_fun或mem_fun_ref搞得一团混乱了,简单地说,tr1::binf是第二代绑定工具,比其前一代好得多。
(下面分别对上面的三个组件的使用方法简单介绍)