example2_demangling.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <cxxabi.h>
#include <memory>
#include <string>

std::string demangle(const char* mangled_name) {
    int status;
    std::unique_ptr<char, void(*)(void*)> result(
        abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status),
        std::free
    );
    return (status == 0) ? result.get() : mangled_name;
}

template <typename T>
void print_function_name(T func) {
    std::cout << "Function name: " << demangle(typeid(func).name()) << std::endl;
}

void simple_function() {}

class MyClass {
public:
    void member_function() {}
};

int main() {
    print_function_name(simple_function);
    print_function_name(&MyClass::member_function);

    return 0;
}
Back to cxxabi.h