gpt4 book ai didi

c++ - 以编程方式检索 C++ 类名

转载 作者:IT老高 更新时间:2023-10-28 13:58:14 26 4
gpt4 key购买 nike

我想知道是否可以在 C++ 中以字符串形式检索类的名称,而无需将其硬编码到变量或 getter 中。我知道在运行时实际上并没有使用这些信息,因此它不可用,但是是否可以创建任何宏来创建此功能?

编辑:请注意,我实际上是在尝试检索派生类的名称,并且我使用的是 Visual C++ 2008 Express Edition。

最佳答案

您可以使用 typeid :

#include <typeinfo>

std::cout << typeid(obj).name() << "\n";

但是,类型名称不是标准化的,并且在不同的编译器(甚至同一编译器的不同版本)之间可能会有所不同,而且它通常不是人类可读的,因为它是 mangled .

在 GCC 和 clang(使用 libstdc++ 和 libc++)上,您可以使用 __cxa_demangle function (似乎没有必要对 MSVC 进行拆解):

#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()};
}

这将仍然不一定是可读的名称 - 例如,std::string是实际类型的类型名,它在当前libstdc++中的完整类型名是std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > ;相比之下,在当前的 libc++ 中,它是 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > .不幸的是,“美化”类型别名并非易事。

关于c++ - 以编程方式检索 C++ 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1024648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com