您可以尝试使用"typeid"。
这不适用于“对象”名称,但您知道对象名称,因此您只需将其存储在某个地方。编译器不在乎你给一个对象起什么名字。
不过,值得记住的是,typeid 的输出是编译器特定的东西,所以即使它在当前平台上产生了你所追求的东西,它也可能不会在另一个平台上产生。这对您来说可能是也可能不是问题。
另一种解决方案是创建某种模板包装器来存储类名。然后你需要使用部分特化来让它为你返回正确的类名。这具有工作编译时间的优点,但要复杂得多。
编辑:更明确
template< typename Type > class ClassName
{
public:
static std::string name()
{
return "Unknown";
}
};
然后对于每个类,一些事情如下:
template<> class ClassName<MyClass>
{
public:
static std::string name()
{
return "MyClass";
}
};
甚至可以宏化如下:
#define DefineClassName( className ) \
\
template<> class ClassName<className> \
{ \
public: \
static std::string name() \
{ \
return #className; \
} \
}; \
让你,简单地,做
DefineClassName( MyClass );
最后要获取类名,您需要执行以下操作:
ClassName< MyClass >::name();
Edit2:进一步详细说明,您需要将此“DefineClassName”宏放入您创建的每个类中,并定义一个“类名”函数,该函数将调用静态模板函数。
Edit3:考虑一下......早上第一件事显然很糟糕,因为您不妨定义一个成员函数“classname()”,如下所示:
std::string classname()
{
return "MyClass";
}
可以按如下方式进行宏化:
DefineClassName( className ) \
std::string classname() \
{ \
return #className; \
}
然后你可以简单地放下
DefineClassName( MyClass );
进入你定义的类......