#define NULL nullptr
template <class T, class FPTR = void (void *)>
class CSmartPtr
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
CSmartPtr()
{
m_TData = NULL;
m_deleter = NULL;
}
CSmartPtr(T* TData)
{
m_TData = TData;
m_deleter = NULL;
}
CSmartPtr(T* TData, FPTR *deleter)
{
m_TData = TData;
m_deleter = deleter;
}
~CSmartPtr()
{
if (NULL == m_deleter)
{
delete m_TData;
}
else
{
m_deleter(m_TData);
}
}
T *const operator-> () const
{
return m_TData;
}
//-----------------------------------------------------------------------
// Getter methods
//-----------------------------------------------------------------------
T *const get() const
{
return m_TData;
}
void reset(T* TData)
{
if (NULL != m_TData)
{
if (NULL == m_deleter)
{
delete m_TData;
}
else
{
m_deleter(m_TData);
}
}
m_TData = TData;
}
private :
// -----------------------------------------------------------------------
// Private data members
//
// fUnicodeForm
// This is the Unicode XMLCh format of the string.
// -----------------------------------------------------------------------
T *m_TData;
FPTR *m_deleter;
};
int main( void )
{
CSmartPtr<char> apbySrcBuff1; // This doesnt work.
CSmartPtr<char, void (void *)> apbySrcBuff; // This works.
return true;
}
I2RlZmluZSBOVUxMIG51bGxwdHIKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBGUFRSID0gdm9pZCAodm9pZCAqKT4gCmNsYXNzIENTbWFydFB0cgp7CnB1YmxpYyA6Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBDb25zdHJ1Y3RvcnMgYW5kIERlc3RydWN0b3IKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ1NtYXJ0UHRyKCkKewogICAgbV9URGF0YSA9IE5VTEw7CiAgICBtX2RlbGV0ZXIgPSBOVUxMOwp9CgpDU21hcnRQdHIoVCogVERhdGEpCnsKICAgIG1fVERhdGEgPSBURGF0YTsKICAgIG1fZGVsZXRlciA9IE5VTEw7Cn0KCkNTbWFydFB0cihUKiBURGF0YSwgRlBUUiAqZGVsZXRlcikKewogICAgbV9URGF0YSA9IFREYXRhOwogICAgbV9kZWxldGVyID0gZGVsZXRlcjsKfQoKfkNTbWFydFB0cigpCnsKICAgIGlmIChOVUxMID09IG1fZGVsZXRlcikKICAgIHsKICAgICAgICBkZWxldGUgbV9URGF0YTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBtX2RlbGV0ZXIobV9URGF0YSk7CiAgICB9Cn0KClQgKmNvbnN0IG9wZXJhdG9yLT4gKCkgY29uc3QKewogICAgcmV0dXJuIG1fVERhdGE7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR2V0dGVyIG1ldGhvZHMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUICpjb25zdCBnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gbV9URGF0YTsKfQoKdm9pZCByZXNldChUKiBURGF0YSkKewogICAgaWYgKE5VTEwgIT0gbV9URGF0YSkKICAgIHsKICAgICAgICBpZiAoTlVMTCA9PSBtX2RlbGV0ZXIpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgbV9URGF0YTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbV9kZWxldGVyKG1fVERhdGEpOwogICAgICAgIH0KICAgIH0KCiAgICBtX1REYXRhID0gVERhdGE7Cn0KCnByaXZhdGUgOgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIFByaXZhdGUgZGF0YSBtZW1iZXJzCi8vCi8vICBmVW5pY29kZUZvcm0KLy8gICAgICBUaGlzIGlzIHRoZSBVbmljb2RlIFhNTENoIGZvcm1hdCBvZiB0aGUgc3RyaW5nLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUICptX1REYXRhOwpGUFRSICptX2RlbGV0ZXI7Cn07CgppbnQgbWFpbiggdm9pZCApCnsKICAgIENTbWFydFB0cjxjaGFyPiBhcGJ5U3JjQnVmZjE7ICAgICAgLy8gVGhpcyBkb2VzbnQgd29yay4KICAgIENTbWFydFB0cjxjaGFyLCB2b2lkICh2b2lkICopPiBhcGJ5U3JjQnVmZjsgICAgICAvLyBUaGlzIHdvcmtzLgoKICAgIHJldHVybiB0cnVlOwp9Cg==