Получить имя класса
Мне нужно для логирования получить имя текущего класса. Вот здесь советуют делать так
void MyNS::CMyClassImpl::Test() {
std::cout << typeid(*this).name();
}
Проблема в том, что для класса
namespace MyNS {
class ATL_NO_VTABLE CMyClassImpl :
public ATL::CComObjectRoot,
public ATL::CComCoClass<CMyClassImpl, &CLSID_CoMyClass>,
public ATL::IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_rsMyLib, 1, 0>,
public CComISupportErrorInfoImpl<&IID_IMyClass>
{
void Test();
}
}
Я получаю строку
class ATL::CComObject<class MyNS::CMyClassImpl>
Два вопроса:
- Почему?
- Хотелось бы получить
CMyClassImplили хотя быMyNS::CMyClassImpl, а потом натравить парсер.
Все это для Visual Studio
Update
Макроса __PRETTY_FUNCTION__ в VS нет. А __FUNCTION__ возвращает MyNS::CMyClassImpl::MyMethod. Если не будет других вариантов, то буду использовать его
Ответы (2 шт):
Почему?
typeid(*this) возвращает id не текущего типа, а id финального класса иерархии (экземпляр которого был создан). ATL не может создать экземпляр непосредственно класса CMyClassImpl, поскольку это абстрактный класс. Вместо этого он создает ATL::CComObject<CMyClassImpl>, в котором определены недостающие абстрактные функции.
Если нужно узнать какой тип имеет *this в текущем контексте, пишите typeid(decltype(*this)). (remove_c_v, добавлять по вкусу.)
Получилось так
std::string getClassName(const std::string & methodName) {
size_t pos = methodName.find(' ');
if (pos == std::string::npos)
return "";
if (methodName.substr(0, pos) != "class")
return "";
size_t startPos = methodName.rfind("::");
if (startPos == std::string::npos)
startPos = pos;
else
startPos += 2;
return methodName.substr(startPos);
}
#define __CLASS__ getClassName(typeid(decltype(*this)).name())