¿Hay una __CLASS__
macro en C ++ que da el nombre de la clase similar a la __FUNCTION__
macro que da el nombre de la función?
100
Lo más cercano que hay es llamar typeid(your_class).name()
, pero esto produce un nombre mutilado específico del compilador.
Para usarlo dentro de la clase solo typeid(*this).name()
__func__
y no estándar__FUNCTION__
no son macros. Microsoft documenta__FUNCTION__
como una macro, pero el indicio de que no lo es en realidad es que el preprocesador no lo expande cuando compila con/P
.El problema con el uso
typeid(*this).name()
es que no haythis
puntero en una llamada a un método estático. La macro__PRETTY_FUNCTION__
informa un nombre de clase en funciones estáticas, así como llamadas a métodos. Sin embargo, esto solo funcionará con gcc.A continuación, se muestra un ejemplo de cómo extraer la información a través de una interfaz de estilo macro.
La macro
__METHOD_NAME__
devolverá una cadena de la forma<class>::<method>()
, recortando el tipo de retorno, modificadores y argumentos de lo que__PRETTY_FUNCTION__
le da.Para algo que extrae solo el nombre de la clase, se debe tener cuidado de atrapar situaciones donde no hay una clase:
fuente
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
uno podría utilizarrfind(' ', colons)
para ahorrar una creación de una cadena extra.__METHOD_NAME__
macro. Mira aquí .constexpr
función para evaluarla en tiempo de compilaciónMe gustaría sugerir boost :: typeindex , que aprendí de "Effective Modern C ++" de Scott Meyer. Aquí hay un ejemplo básico:
Ejemplo
Compilado con "g ++ --std = c ++ 14", esto produce lo siguiente
Salida
fuente
Aún no. (Creo que
__class__
se propone en alguna parte). También puede intentar extraer la parte de la clase__PRETTY_FUNCTION__
.fuente
Creo que usar
__PRETTY_FUNCTION__
es lo suficientemente bueno, aunque también incluye espacio de nombres, es decir,namespace::classname::functionname
hasta que__CLASS__
esté disponible.fuente
Si su compilador lo es
g++
y lo está solicitando__CLASS__
porque desea una forma de obtener el nombre del método actual, incluida la clase,__PRETTY_FUNCTION__
debería ayudar (de acuerdo con lainfo gcc
sección 5.43 Nombres de funciones como cadenas ).fuente
Si necesita algo que realmente produzca el nombre de la clase en tiempo de compilación, puede usar C ++ 11 para hacer esto:
Reconozco que esto no es lo mismo que
__FUNCTION__
pero encontré esta publicación mientras buscaba una respuesta como esta. :REfuente
Si está hablando de MS C ++ (debe indicar, especialmente porque
__FUNCTION__
es una extensión no estándar), hay símbolos__FUNCDNAME__
y__FUNCSIG__
que podría analizarfuente
Puede obtener el nombre de la función, incluido el nombre de la clase. Esto puede procesar funciones de tipo C.
fuente
Mi solución:
Trabajo para Visual C ++ 12.
fuente
Aquí hay una solución basada en las
__FUNCTION__
plantillas macro y C ++:Aquí hay un ejemplo de cómo se podría usar esto para una clase de registrador
La salida de
Example::Run
será entoncesfuente
Esto funciona bastante bien si está dispuesto a pagar el costo de un puntero.
fuente
También funciona con msvc y gcc
fuente
Todas las soluciones publicadas anteriormente que se basan en
__PRETTY_FUNCTION__
sí tienen casos de borde específicos en los que no devuelven solo el nombre de clase / nombre de clase. Por ejemplo, considere el siguiente valor de función bonita:El uso de la última aparición de
"::"
como delimter no funcionará ya que el parámetro de la función también contiene un"::"
(std::string
). Puede encontrar casos extremos similares para"("
como delimitador y más. La única solución que encontré toma las macros__FUNCTION__
y__PRETTY_FUNCTION__
como parámetros. Aquí está el código completo:fuente
El siguiente método (basado en methodName () anterior) también puede manejar entradas como "int main (int argc, char ** argv)":
fuente