#include <cstdint>
#include <iostream>
class PSBaseObject
{
public:
PSBaseObject() {}
virtual ~PSBaseObject() {std::cout<<"PSBaseObject destructor\n";}
virtual void* data() { std::cout<<"PSBaseObject->data()\n"; return this; }
virtual const void* data() const { std::cout<<"PSBaseObject->data()\n"; return this; }
};
template<typename T>
class PSObject : public PSBaseObject
{
private:
T* data_;
public:
PSObject(T* object) : data_(object) {}
~PSObject() { delete data_; std::cout<<"PSObject destructor\n";}
T* data() { std::cout<<"PSObject->data()\n"; return data_; }
const T* data() const { std::cout<<"PSObject->data()\n"; return data_; }
};
typedef struct
{
void* hFileMap;
void* pData;
std::size_t size;
} data;
int main()
{
data* info = new data();
PSObject<data>* ptr = new PSObject<data>(info);
ptr->data();
delete ptr;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIFBTQmFzZU9iamVjdAp7CiAgICBwdWJsaWM6CiAgICAgICAgUFNCYXNlT2JqZWN0KCkge30KICAgICAgICB2aXJ0dWFsIH5QU0Jhc2VPYmplY3QoKSB7c3RkOjpjb3V0PDwiUFNCYXNlT2JqZWN0IGRlc3RydWN0b3JcbiI7fQoKICAgICAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7IHN0ZDo6Y291dDw8IlBTQmFzZU9iamVjdC0+ZGF0YSgpXG4iOyByZXR1cm4gdGhpczsgfQogICAgICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgc3RkOjpjb3V0PDwiUFNCYXNlT2JqZWN0LT5kYXRhKClcbiI7IHJldHVybiB0aGlzOyB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBQU09iamVjdCA6IHB1YmxpYyBQU0Jhc2VPYmplY3QKewogICAgcHJpdmF0ZToKICAgICAgICBUKiBkYXRhXzsKCiAgICBwdWJsaWM6CiAgICAgICAgUFNPYmplY3QoVCogb2JqZWN0KSA6IGRhdGFfKG9iamVjdCkge30KICAgICAgICB+UFNPYmplY3QoKSB7IGRlbGV0ZSBkYXRhXzsgc3RkOjpjb3V0PDwiUFNPYmplY3QgZGVzdHJ1Y3RvclxuIjt9CgogICAgICAgIFQqIGRhdGEoKSB7IHN0ZDo6Y291dDw8IlBTT2JqZWN0LT5kYXRhKClcbiI7IHJldHVybiBkYXRhXzsgfQogICAgICAgIGNvbnN0IFQqIGRhdGEoKSBjb25zdCB7IHN0ZDo6Y291dDw8IlBTT2JqZWN0LT5kYXRhKClcbiI7IHJldHVybiBkYXRhXzsgfQp9OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgdm9pZCogaEZpbGVNYXA7CiAgICB2b2lkKiBwRGF0YTsKICAgIHN0ZDo6c2l6ZV90IHNpemU7IAp9IGRhdGE7CgppbnQgbWFpbigpCnsKCWRhdGEqIGluZm8gPSBuZXcgZGF0YSgpOwoJUFNPYmplY3Q8ZGF0YT4qIHB0ciA9IG5ldyBQU09iamVjdDxkYXRhPihpbmZvKTsKCXB0ci0+ZGF0YSgpOwoJZGVsZXRlIHB0cjsKfQ==