在C++中,当我们使用typeid
要获取对象或类的类型名称,它将显示一个修饰(损坏)字符串。我用cxxabi
解开它:
#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
输出是:
MyNamesspace::MyBaseClass
我要移除MyNamespace::
从上面的字符串。
但有没有标准的方法cxxabi
或者其他库来做这件事还是一个清晰的解决方案?(至少在GCC和Visual C++之间可移植)
发布于 2018-02-20 09:49:58
没有标准的方法来做到这一点,因为没有标准的方法来做名称修改。 如何表示名称是故意未指定的。 C ++标准中没有ABI。 您正在使用的函数abi :: __ cxa_demangle
是Itanium C ++ ABI的一部分。 这个功能可能存在也可能不存在。
发布于 2018-02-20 10:57:51
在GCC中,有一个名为__FUNCTION__的变量作为gnu c语言扩展的一部分,它在C ++中被当作一个变量来处理。 (根据GCC版本的不同,C处理方式不同)
在Visual Studio中,有一个预定义的宏,它具有相同的名称并执行相同的工作。 说明在这里。
可以使用__FUNCTION__来获取当前函数的名称。 所以,要得到类的名字,可能你可以在类的构造函数中使用它:
namespace MyNamespace
{
class MyBaseClass
{
public:
MyBaseClass(): myName(__FUNCTION__){}
string name() { return myName; }
private:
string myName;
};
}
所以,如果你调用这个类的实例的name()
函数,你会得到“MyBaseClass”
响应。
发布于 2018-02-20 11:36:55
如果只想定义一个成员函数,它将返回类的字符串名称,而不使用命名空间,那么我想知道为什么要使用cxxabi
甚至__FUNCTION__
或者其他任何事情,除了简单地这样做:
namespace MyNamespace
{
class MyBaseClass
{
public:
//make the function const as well
std::string name() const { return "MyBaseClass"; }
};
}
还可以添加另一个成员函数:
std::string fullname() const { return "MyNamespace::MyBaseClass"; }
https://stackoverflow.com/questions/-100007402
复制相似问题