#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++模板获取函数签名