#include <iostream>
#include <cstring>
template <typename T>
class Deleter
{
public:
void operator()(T* ptr) const {
std::cout << "freeing memory using 'delete'...\n";
delete ptr;
}
};
template <typename T>
class Deleter<T[]>
{
public:
template <typename U>
void operator()(U* ptr) const {
std::cout << "freeing memory using 'delete[]'...\n";
delete[] ptr;
}
};
int main()
{
int* pi = new int(7);
char* cp = new char[100];
std::strcpy(cp, "hi there!");
Deleter<int> del1;
del1(pi);
Deleter<char[]> del2;
del2(cp);
std::cout << "\ndone\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBEZWxldGVyCnsKcHVibGljOgogICAgdm9pZCBvcGVyYXRvcigpKFQqIHB0cikgY29uc3QgewogICAgICAgIHN0ZDo6Y291dCA8PCAiZnJlZWluZyBtZW1vcnkgdXNpbmcgJ2RlbGV0ZScuLi5cbiI7CiAgICAgICAgZGVsZXRlIHB0cjsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBEZWxldGVyPFRbXT4KewpwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KICAgIHZvaWQgb3BlcmF0b3IoKShVKiBwdHIpIGNvbnN0IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImZyZWVpbmcgbWVtb3J5IHVzaW5nICdkZWxldGVbXScuLi5cbiI7CiAgICAgICAgZGVsZXRlW10gcHRyOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBpbnQqIHBpID0gbmV3IGludCg3KTsKICAgIGNoYXIqIGNwID0gbmV3IGNoYXJbMTAwXTsKICAgIHN0ZDo6c3RyY3B5KGNwLCAiaGkgdGhlcmUhIik7CgogICAgRGVsZXRlcjxpbnQ+IGRlbDE7CiAgICBkZWwxKHBpKTsKCiAgICBEZWxldGVyPGNoYXJbXT4gZGVsMjsKICAgIGRlbDIoY3ApOwoKICAgIHN0ZDo6Y291dCA8PCAiXG5kb25lXG4iOwoKICAgIHJldHVybiAwOwp9