Puede probar con "typeid".
Esto no funciona para el nombre de "objeto", pero USTED conoce el nombre del objeto, por lo que solo tendrá que almacenarlo en alguna parte. Al compilador no le importa lo que haya nombrado un objeto.
Vale la pena tener en cuenta, sin embargo, que la salida de typeid es una cosa específica del compilador, por lo que incluso si produce lo que busca en la plataforma actual, puede que no en otra. Esto puede o no ser un problema para ti.
La otra solución es crear algún tipo de envoltorio de plantilla en el que almacene el nombre de clase. Luego debe usar la especialización parcial para que le devuelva el nombre de clase correcto. Esto tiene la ventaja de trabajar en tiempo de compilación pero es significativamente más complejo.
Editar: Al ser más explícita
template< typename Type > class ClassName
{
public:
static std::string name()
{
return "Unknown";
}
};
Luego, para cada clase somethign liek lo siguiente:
template<> class ClassName<MyClass>
{
public:
static std::string name()
{
return "MyClass";
}
};
que incluso podría ser macro'd de la siguiente manera:
#define DefineClassName(className) \
\
template<> class ClassName<className> \
{ \
public: \
static std::string name() \
{ \
return #className; \
} \
}; \
Permitiendo usted para, simplemente, hacer
DefineClassName(MyClass);
último para obtener el nombre de la clase que haría lo siguiente:
ClassName<MyClass>::name();
Edit2: Abundando aún más, a continuación, había necesidad de poner esta macro "DefineClassName" en cada clase de realizar y definir un " nombre de clase "función que llamaría a la función de plantilla estática.
Edit3: Y pensando en ello ... Su obviamente mala fijación a primera hora de la mañana, ya que puede que también acaba de definir un "nombre de clase()" función miembro de la siguiente manera:
std::string classname()
{
return "MyClass";
}
el cual puede ser macro'd de la siguiente manera:
DefineClassName(className) \
std::string classname() \
{ \
return #className; \
}
a continuación, puede simplemente dejar
DefineClassName(MyClass);
en el cl culo como lo defines ...
Estoy confundido. ¿Estás relacionando C++ 'class' con una" clase de estudiantes "? Si tiene una 'clase' que representa una clase, y la clase tiene un nombre como" Kiendagarten de la Sra. Gutentag ", debe tener un miembro de datos para almacenar eso como' std :: string'. – Potatoswatter
@Potatoswatter: Ahora, estoy confundido. ¿Que estas preguntando? – Lazer
Hay dos significados para la palabra "clase", y el tipo de clase que tiene los estudiantes no es a lo que se refiere la palabra clave 'clase'. – Potatoswatter