#include <functional>
#include <iostream>
#include <tuple>
using M3Result = const char*;
namespace cc {
template<char c>
struct m3_sig {
static const char value = c;
};
template<typename T> struct m3_type_to_sig;
template<> struct m3_type_to_sig<int32_t> : m3_sig<'i'> {};
template<> struct m3_type_to_sig<int64_t> : m3_sig<'I'> {};
template<> struct m3_type_to_sig<float> : m3_sig<'f'> {};
template<> struct m3_type_to_sig<double> : m3_sig<'F'> {};
template<> struct m3_type_to_sig<void> : m3_sig<'v'> {};
template<> struct m3_type_to_sig<void *> : m3_sig<'*'> {};
template<> struct m3_type_to_sig<const void *> : m3_sig<'*'> {};
template<typename Ret, typename ... Args>
struct m3_signature {
constexpr static size_t n_args = sizeof...(Args);
constexpr static const char value[sizeof...(Args) + 4]
= {
m3_type_to_sig<Ret>::value,
'(',
m3_type_to_sig<Args>::value...,
')',
0
};
};
template<typename Ret, typename ... Args>
constexpr const char m3_signature<Ret, Args...>::value[sizeof...(Args) + 4];
}
template<typename Func>
class Wrapper;
template<typename Ret, typename ... Args>
class Wrapper<Ret(Args...)> {
public:
static M3Result link() {
return cc::m3_signature<Ret, Args...>::value;
}
};
class Module {
public:
template<typename Func>
M3Result link(Func *function) {
M3Result ret = Wrapper<Func>::link();
return ret;
}
};
void* Test(int, float) {
return 0;
}
int main() {
Module m;
std::cout << m.link(Test) << std::endl; // *(if)
return 0;
}
备份地址: 【c++模板获取函数签名】