Получение RTTI-информации об объекте из оператора new/delete

Допустим, я хочу получить все после следующего класса, и я не предполагаю дальнейшую перегрузку new или delete:

class Object
{
public:
        static map<std::string, unsigned int> typeDeltaMap;
        void* operator new(size_t size)
        {
                void* p = ::new char[size];
                const std::string type = typeid(this).name(); //compile error
                cout << "new type=" << type << endl;
                ++typeDeltaMap[type];
        }
        void operator delete(void* p)
        {
                ::delete(p);
                const std::string type = typeid(this).name(); //compile error
                cout << "delete type=" << type << endl;
                --typeDeltaMap[type];
        }
};

И я хочу закончить с чем-то вроде этого

class A : public Object
{
        public:
                virtual ~A(){}
};

class B : public Object
{
        public:
                virtual ~B(){}
};

int main()
{
        A* a = new A();//prints new type=A
        B* b = new B();//prints new type=B
        delete a;//prints delete type=A
        delete b;//prints delete type=B
}

Я не работаю, так как new и delete являются статическими, но есть какие-то специальные статические, поскольку они виртуальные одновременно. У меня вопрос, есть ли какой-нибудь способ получить такую ​​информацию?

1 ответ

Как @Someprogrammerdude предположил, что я использовал CRTP, который удовлетворяет мои потребности

template<typename T>
class Object
{
public:
        ;
        void* operator new(size_t size)
        {
                const std::string type = typeid(T).name();
                cout << "new type=" << type << endl;
                void* p = ::new char[size];
                return p;
        }
        void operator delete(void* p)
        {
                const std::string type = typeid(T).name();
                cout << "delete type=" << type << endl;
                ::delete(p);
        }
};

class A : public Object<A>
{
public:
virtual ~A(){}
};

class B : public Object<B>
{
public:
virtual ~B(){}
};

int main()
{
        A* a = new A();
        B* b = new B();
        delete a;
        delete b;
}
Другие вопросы по тегам