Czy __CLASS__
w C ++ jest makro, które podaje nazwę klasy podobną do __FUNCTION__
makra, które podaje nazwę funkcji
100
Najbliższą rzeczą, jaką można wywołać, jest to, typeid(your_class).name()
że tworzy to zniekształconą nazwę specyficzną dla kompilatora.
Aby użyć go tylko w klasie typeid(*this).name()
__func__
i niestandardowe__FUNCTION__
nie są makrami. Dokumenty Microsoft__FUNCTION__
jako makra, ale fakt, że tak naprawdę nie jest, polega na tym, że nie jest rozszerzany przez preprocesor podczas kompilacji z/P
.Problem z użyciem
typeid(*this).name()
polega na tym, żethis
w wywołaniu metody statycznej nie ma wskaźnika. Makro__PRETTY_FUNCTION__
zgłasza nazwę klasy w funkcjach statycznych, a także w wywołaniach metod. Jednak zadziała to tylko z gcc.Oto przykład wyodrębniania informacji za pomocą interfejsu w stylu makr.
Makro
__METHOD_NAME__
zwróci ciąg formularza<class>::<method>()
, przycinając zwracany typ, modyfikatory i argumenty z tego, co__PRETTY_FUNCTION__
daje.W przypadku czegoś, co wyodrębnia tylko nazwę klasy, należy zwrócić uwagę na sytuacje, w których nie ma klasy:
źródło
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
jednego można użyć,rfind(' ', colons)
aby oszczędzić tworzenie dodatkowego ciągu.__METHOD_NAME__
makra. Sprawdź tutaj .constexpr
funkcji funkcję do oceny w czasie kompilacjiChciałbym zasugerować metodę boost :: typeindex , o której dowiedziałem się z „Effective Modern C ++” Scotta Meyera. Oto podstawowy przykład:
Przykład
Skompilowane z "g ++ --std = c ++ 14" daje to co następuje
Wynik
źródło
Jeszcze nie. (Myślę, że
__class__
jest gdzieś proponowany). Możesz także spróbować wyodrębnić część klasy z pliku__PRETTY_FUNCTION__
.źródło
Myślę, że używanie
__PRETTY_FUNCTION__
jest wystarczająco dobre, chociaż obejmuje również przestrzeń nazw, tj.namespace::classname::functionname
Dopóki nie__CLASS__
będzie dostępne.źródło
Jeśli Twój kompilator jest
g++
i pytasz o to,__CLASS__
ponieważ chcesz uzyskać sposób na pobranie aktualnej nazwy metody, w tym klasy,__PRETTY_FUNCTION__
powinno pomóc (zgodnie zinfo gcc
rozdziałem 5.43 Nazwy funkcji jako ciągi znaków ).źródło
Jeśli potrzebujesz czegoś, co faktycznie wygeneruje nazwę klasy w czasie kompilacji, możesz użyć C ++ 11, aby to zrobić:
Zdaję sobie sprawę, że to nie to samo co,
__FUNCTION__
ale znalazłem ten post, szukając takiej odpowiedzi. :REźródło
Jeśli mówisz MS C ++ (Należy stwierdzić, szczególnie jak
__FUNCTION__
jest niestandardowym rozszerzeniem), istnieją__FUNCDNAME__
i__FUNCSIG__
symbole , które można zanalizowaćźródło
Możesz uzyskać nazwę funkcji, w tym nazwę klasy. Może to przetwarzać funkcje typu C.
źródło
Moje rozwiązanie:
Pracuję dla Visual C ++ 12.
źródło
Oto rozwiązanie oparte na
__FUNCTION__
szablonach makr i C ++:Oto przykład, jak można to wykorzystać dla klasy rejestratora
Wynik
Example::Run
będzie wtedyźródło
Działa to całkiem nieźle, jeśli jesteś gotów zapłacić cenę wskaźnika.
źródło
Działa również z msvc i gcc
źródło
Wszystkie powyższe rozwiązania, które opierają się na tym
__PRETTY_FUNCTION__
, mają określone przypadki skrajne, w których nie zwracają tylko nazwy klasy / nazwy klasy. Na przykład rozważ następującą ładną wartość funkcji:Użycie ostatniego wystąpienia
"::"
as delimter nie zadziała, ponieważ parametr funkcji zawiera również"::"
(std::string
). Możesz znaleźć podobne przypadki krawędzi dla"("
separatora as i nie tylko. Jedyne rozwiązanie, które znalazłem, przyjmuje zarówno makra, jak__FUNCTION__
i__PRETTY_FUNCTION__
jako parametry. Oto pełny kod:źródło
Następująca metoda (oparta na powyższej metodzie methodName ()) może również obsługiwać dane wejściowe, takie jak „int main (int argc, char ** argv)”:
źródło