Vous pouvez utiliser typeid
:
#include <typeinfo>
std::cout << typeid(obj).name() << "\n";
Cependant, le nom du type n'est pas normalisé et peut différer d'un compilateur à l'autre (ou même d'une version à l'autre du même compilateur), et il n'est généralement pas lisible par l'homme parce qu'il est mutilé .
Sous GCC et clang (avec libstdc++ et libc++), vous pouvez démêler les noms à l'aide de la commande __cxa_demangle
fonction (sur MSVC, le démêlage ne semble pas nécessaire) :
#include <cxxabi.h>
#include <cstdlib>
#include <memory>
#include <string>
std::string demangle(char const* mangled) {
auto ptr = std::unique_ptr<char, decltype(& std::free)>{
abi::__cxa_demangle(mangled, nullptr, nullptr, nullptr),
std::free
};
return {ptr.get()};
}
Cela permettra toujours ne doit pas nécessairement être un nom lisible - par exemple, std::string
est un nom de type pour le type réel, et son nom de type complet dans la libstdc++ actuelle est std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
Par contre, dans la libc++ actuelle, c'est std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
. "Prettifier" les alias de type n'est malheureusement pas trivial.
0 votes
Comme cela dépend du compilateur, avec quel compilateur travaillez-vous ?
0 votes
J'utilise visual c++ 2008 express, et je pense qu'il serait utile de préciser que j'essaie en fait de récupérer le nom d'une classe dérivée
0 votes
Peut-être ceci stackoverflow.com/a/3649351/6459731 ?