它的用途确实非常有限。
例如,一个用例是智能指针,因为它们经常在 Direct3D 中用于包装IUnknown
对象。
我假设您不熟悉 Direct3D,所以我将对此进行更多讨论。许多 Direct3D 类派生自IUnknown
它们并在使用后必须调用Release
. 是的,D3D 内部使用引用计数。人们往往会忘记打电话Release
,这真的很乏味。所以一个人所做的就是将它包装IUnknown
成一个smartpointer
它将在幕后进行发布。
smart_pointer<ID3D11Device> device = // ..
因此,通过声明&device
您不想要 的地址smart_pointer<ID3D11Device>
,您想要 的地址ID3D11Device
。
template <class T>
class com_ptr
{
private:
T *inst;
public:
// many other methods/overloadings
T** operator & ()
{
return &inst;
}
};
底线:这样,您可以Release
在析构函数中调用,而不必在其余代码中关心它。
底线 2:更好的方法是添加一个get()
返回实习生对象的方法。
T** get()
{
return &inst;
}