¿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 haythispuntero 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í .constexprfunció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::functionnamehasta 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 gccsecció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::Runserá 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