Есть ли __CLASS__
в С ++ макрос, который дает имя класса, подобное __FUNCTION__
макросу, которое дает имя функции
101
Ближе всего есть вызов, typeid(your_class).name()
но это дает искореженное имя компилятора.
Чтобы использовать его внутри класса, просто typeid(*this).name()
__func__
и нестандартные не__FUNCTION__
являются макросами. Microsoft документирует__FUNCTION__
макрос как макрос, но на самом деле это не так, потому что он не расширяется препроцессором при компиляции с/P
.Проблема с использованием
typeid(*this).name()
заключается в том, чтоthis
в вызове статического метода нет указателя. Макрос__PRETTY_FUNCTION__
сообщает имя класса в статических функциях, а также вызовы методов. Однако это будет работать только с gcc.Вот пример извлечения информации через интерфейс в стиле макроса.
Макрос
__METHOD_NAME__
вернет строку формы<class>::<method>()
, обрезая возвращаемый тип, модификаторы и аргументы из того, что__PRETTY_FUNCTION__
вам дает.Для чего-то, что извлекает только имя класса, нужно позаботиться о том, чтобы уловить ситуации, когда класса нет:
источник
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
одного можно было бы использоватьrfind(' ', colons)
для создания дополнительной строки.__METHOD_NAME__
макроса. Проверить здесь .constexpr
функцию для оценки во время компиляцииЯ хотел бы предложить boost :: typeindex , о котором я узнал из "Эффективного современного C ++" Скотта Мейера. Вот простой пример:
пример
При компиляции с помощью "g ++ --std = c ++ 14" получается следующее
Вывод
источник
Еще нет. (Думаю,
__class__
где-то предлагается). Вы также можете попробовать извлечь часть класса из__PRETTY_FUNCTION__
.источник
Я думаю, что использование
__PRETTY_FUNCTION__
достаточно хорошо, хотя оно также включает пространство имен, т.е.namespace::classname::functionname
пока__CLASS__
оно не доступно.источник
Если ваш компилятор есть,
g++
и вы просите,__CLASS__
потому что вам нужен способ получить текущее имя метода, включая класс,__PRETTY_FUNCTION__
должно помочь (согласноinfo gcc
разделу 5.43 Имена функций как строки ).источник
Если вам нужно что-то, что действительно создаст имя класса во время компиляции, вы можете использовать C ++ 11 для этого:
Я понимаю, что это не то же самое,
__FUNCTION__
но я нашел этот пост, когда искал такой ответ. : Dисточник
Если вы говорите о MS C ++ (вы должны указать, особенно как
__FUNCTION__
нестандартное расширение), есть__FUNCDNAME__
и__FUNCSIG__
символы, которые вы можете разобратьисточник
Вы можете получить имя функции, включая имя класса. Это может обрабатывать функции C-типа.
источник
Мое решение:
Я работаю на Visual C ++ 12.
источник
Вот решение, основанное на
__FUNCTION__
макросах и шаблонах C ++:Вот пример того, как это можно использовать для класса регистратора
Результатом
Example::Run
будетисточник
Это отлично работает, если вы готовы заплатить стоимость указателя.
источник
Также работает с msvc и gcc
источник
Все решения, опубликованные выше, которые полагаются на
__PRETTY_FUNCTION__
конкретный крайний случай, когда они не возвращают только имя класса / имя класса. Например, рассмотрим следующее красивое значение функции:Использование последнего появления в
"::"
качестве разделителя не сработает, поскольку параметр функции также содержит"::"
(std::string
). Вы можете найти похожие крайние случаи для"("
разделителя as и других. Единственное решение , которое я нашел принимает как__FUNCTION__
и__PRETTY_FUNCTION__
макросы в качестве параметров. Вот полный код:источник
Следующий метод (на основе метода methodName () выше) также может обрабатывать ввод типа «int main (int argc, char ** argv)»:
источник