在C++中,当我们使用typeid
来获取对象或类的类型名称时,它将显示装饰(损坏)的字符串。我用cxxabi
来还原函数是:在C++中删除类型名称的命名空间
#include <cxxabi.h>
#include <typeinfo>
namespace MyNamespace {
class MyBaseClass
{
public:
const std::string name()
{
int status;
char *realname = abi::__cxa_demangle(typeid (*this).name(),0,0, &status);
std::string n = realname;
free(realname);
return n;
}
};
}
int main()
{
MyNamespace::MyBaseClass h;
std::cout << h.name() << std::endl;
}
输出在gcc
是:
了myNameSpace :: MyBaseClass
我需要从上面的字符串中删除MyNamespace::
。
我可以通过字符串操作删除它们
。
但是
是否有标准方式用cxxabi
或其他库来做到这一点或有明确的解决方案? (至少在gcc和Visual C++之间可移植)
+1,内容翔实的问题。 – iammilind
IIRC对于任何一个类,只要返回相同的字符串(例如“godzilla”)就可以合法执行。 – 6502
您可能希望对类和名称空间使用不同的命名约定,以便您可以立即看到哪个是“X :: Y :: Z :: MyType”中的哪一个。 –