Получение 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;
}