Учитывая std::function
, у него есть функция-член с именем target_type
, которая возвращает typeid
объекта сохраненной функции. Это означает, что вы можете сделать
void printName(std::function<void()> func){
//Need a function name()
std::cout << func.target_type().name();
}
Это возвращает определяемую реализацией строку, уникальную для каждого типа. В Visual Studio эта строка уже удобочитаема. С gcc (или, может быть, это glibc? Я не знаю, кто о чем подробно заботится) вам нужно использовать abi::__cxa_demangle
после включения <cxxabi.h>
, чтобы получить удобочитаемую версию имени типа.
EDIT
Как заметил Матье М., при наличии указателя на функцию возвращаемый им тип будет просто сигнатурой функции. Например:
int function(){return 0;}
printName(function);
Это выведет (при условии, что вы при необходимости разобрали) int (*)()
, которое не является именем функции.
Однако этот метод будет работать с классами:
struct Function
{
int operator()(){return 0;}
};
printName(Function{});
Это напечатает Function
по желанию, но не работает для указателей функций.
person
SirGuy
schedule
31.05.2016
std::function
не нужно ничего инкапсулировать в имя... - person Kuba hasn't forgotten Monica   schedule 31.05.2016printName(magic());
не будет компилироваться. - person user253751   schedule 01.06.2016.target
для решения проблемы: stackoverflow.com/questions/40706805/ - person Ciro Santilli 新疆再教育营六四事件ۍ   schedule 02.03.2020