Skip to content

Instantly share code, notes, and snippets.

@moriyoshi
Created March 29, 2009 15:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save moriyoshi/87430 to your computer and use it in GitHub Desktop.
Save moriyoshi/87430 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include <iostream>
#include <string>
#include <typeinfo>
#include <cxxabi.h>
template<typename Tretval_, typename Targ1_, typename Targ2_>
struct signature
{
typedef Tretval_ retval_type;
typedef Targ1_ arg1_type;
typedef Targ2_ arg2_type;
};
template<typename Tretval_, typename Targ1_, typename Targ2_>
signature<Tretval_, Targ1_, Targ2_>
get_function_signature(Tretval_(*)(Targ1_, Targ2_))
{
return signature<Tretval_, Targ1_, Targ2_>();
}
template<typename Tretval_, typename Targ1_>
signature<Tretval_, Targ1_, void>
get_function_signature(Tretval_(*)(Targ1_))
{
return signature<Tretval_, Targ1_, void>();
}
template<typename Tretval_>
signature<Tretval_, void, void>
get_function_signature(Tretval_(*)())
{
return signature<Tretval_, void, void>();
}
std::string demangled_name(std::type_info const& info)
{
std::string buf;
int status;
char* demangled_name = __cxxabiv1::__cxa_demangle(info.name(), 0, 0, &status);
if (status == 0) {
buf = std::string(demangled_name);
free(demangled_name);
} else {
buf = std::string("<<unknown>>");
}
return buf;
}
template<typename T_>
void print_signature(T_ const&)
{
std::cout << "retval: " << demangled_name(typeid(typename T_::retval_type)) << std::endl;
std::cout << "arg1: " << demangled_name(typeid(typename T_::arg1_type)) << std::endl;
std::cout << "arg2: " << demangled_name(typeid(typename T_::arg2_type)) << std::endl;
}
int main(int, char**)
{
print_signature(get_function_signature(&realloc));
print_signature(get_function_signature(&sleep));
print_signature(get_function_signature(&getpagesize));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment