3- .
(T* - ).
-, : std::atomic<int> -.
-, (std::function<void(T*)> - ).
, . -, . , , ( std::function<void(Base*)> = std::function<void(Derived*)> ? ).
delete t, , delete t.
, reset . , std::function<void()>, T U.
template < typename T > class SP
{
private:
T* pData;
RC* reference;
std::function<void()> destroyData;
public:
template<typename U>
SP(U* pValue):
pData(pValue),
reference(nullptr),
destroyData([pValue]()->void{
delete pValue;
})
{
reference = new RC();
reference->AddRef();
}
template<typename U>
SP(const SP<U>& sp):
pData(sp.pData),
reference(sp.reference),
destroyData(sp.destroyData)
{
reference->AddRef();
}
template<typename U>
SP<T>& operator = (const SP<U>& sp)
{
destroyData = sp.destroyData;
}
~SP()
{
if(reference->Release() == 0)
{
delete reference;
destroyData();
}
}
};
-