Existe uma __CLASS__
macro em C ++ que fornece o nome da classe semelhante à __FUNCTION__
macro que fornece o nome da função
100
A coisa mais próxima que existe é chamar typeid(your_class).name()
- mas isso produz um nome mutilado específico do compilador.
Para usá-lo dentro da classe apenas typeid(*this).name()
__func__
e não padrão__FUNCTION__
não são macros. A Microsoft documenta__FUNCTION__
como uma macro, mas a vantagem de que não é realmente, é que não é expandida pelo pré-processador quando você compila com/P
.O problema de usar
typeid(*this).name()
é que não há nenhumthis
ponteiro em uma chamada de método estático. A macro__PRETTY_FUNCTION__
relata um nome de classe em funções estáticas, bem como chamadas de método. No entanto, isso só funcionará com o gcc.Aqui está um exemplo de extração de informações por meio de uma interface de estilo macro.
A macro
__METHOD_NAME__
retornará uma string do formulário<class>::<method>()
, eliminando o tipo de retorno, modificadores e argumentos do que__PRETTY_FUNCTION__
você fornece.Para algo que extrai apenas o nome da classe, alguns cuidados devem ser tomados para interceptar situações onde não há classe:
fonte
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
um poderia usarrfind(' ', colons)
para poupar a criação de uma string extra.__METHOD_NAME__
macro. Verifique aqui .constexpr
função para avaliá-la em tempo de compilaçãoGostaria de sugerir boost :: typeindex , que aprendi em "Effective Modern C ++" de Scott Meyer. Aqui está um exemplo básico:
Exemplo
Compilado com "g ++ --std = c ++ 14", produz o seguinte
Resultado
fonte
Ainda não. (Eu acho que
__class__
é proposto em algum lugar). Você também pode tentar extrair parte da classe__PRETTY_FUNCTION__
.fonte
Acho que usar
__PRETTY_FUNCTION__
é bom o suficiente, embora inclua o namespace também, ou seja,namespace::classname::functionname
até que__CLASS__
esteja disponível.fonte
Se o seu compilador for
g++
e você está perguntando__CLASS__
porque deseja uma maneira de obter o nome do método atual incluindo a classe,__PRETTY_FUNCTION__
deve ajudar (de acordo com ainfo gcc
seção 5.43 Nomes de funções como strings ).fonte
Se você precisar de algo que realmente produza o nome da classe em tempo de compilação, pode usar C ++ 11 para fazer isso:
Eu reconheço que não é a mesma coisa que
__FUNCTION__
mas encontrei este post enquanto procurava uma resposta como esta. : Dfonte
Se você está falando MS C ++ (Você deve indicar, esp como
__FUNCTION__
é uma extensão não-padrão), existem__FUNCDNAME__
e__FUNCSIG__
símbolos que você pode analisarfonte
Você pode obter o nome da função, incluindo o nome da classe. Isso pode processar funções do tipo C.
fonte
Minha solução:
Eu trabalho para Visual C ++ 12.
fonte
Esta é uma solução baseada nos
__FUNCTION__
modelos de macro e C ++:Aqui está um exemplo de como isso poderia ser usado para uma classe de logger
A saída de
Example::Run
será entãofonte
Isso funciona muito bem se você estiver disposto a pagar o custo de um ponteiro.
fonte
Funciona com msvc e gcc também
fonte
Todas as soluções postadas acima que dependem de
__PRETTY_FUNCTION__
possuem casos extremos específicos em que não retornam apenas o nome da classe / nome da classe. Por exemplo, considere o seguinte valor de função bonita:Usar a última ocorrência de
"::"
como delimitador não funcionará, pois o parâmetro da função também contém um"::"
(std::string
). Você pode encontrar casos extremos semelhantes para"("
como delimitador e muito mais. A única solução que encontrei usa as macros__FUNCTION__
e__PRETTY_FUNCTION__
como parâmetros. Aqui está o código completo:fonte
O método a seguir (com base em methodName () acima) também pode lidar com entradas como "int main (int argc, char ** argv)":
fonte