Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <typeinfo>
- #include <cxxabi.h>
- #include <cstdlib>
- #include <string>
- std::string getReadableTypeinfo(const char* info)
- {
- int status;
- char* s=abi::__cxa_demangle(info, /*nullptr*/NULL, /*nullptr*/NULL, &status);
- if (status != 0)
- return "Invalid argument";
- std::string result = s;
- free(s);
- return result;
- }
- using namespace std;
- // using size_t = decltype(sizeof(0));
- template <typename OldType, size_t index, typename NewType>
- struct changeType;
- template <template <typename... Args> class OldType, size_t index, typename NewType, typename ArgType, typename... Others>
- struct changeType<OldType<ArgType, Others...>, index, NewType>
- {
- template <typename... Types>
- using type = typename changeType<OldType<Others...>, index-1, NewType>::template type<Types..., ArgType>;
- };
- template <template <typename... Args> class OldType, typename NewType, typename ArgType, typename... Others>
- struct changeType<OldType<ArgType, Others...>, 0, NewType>
- {
- template <typename... Types>
- using type = typename changeType<OldType<Others...>, size_t(-1), NewType>::template type<Types..., NewType>;
- };
- template <template <typename... Args> class OldType, size_t index, typename NewType>
- struct changeType<OldType<>, index, NewType>
- {
- template <typename... Types>
- using type = OldType<Types...>;
- };
- template <typename... T>
- struct fn
- {
- };
- int main() {
- cout << getReadableTypeinfo(typeid(fn<int, int, int, int, int>).name()) << endl;
- cout << getReadableTypeinfo(typeid(changeType<fn<int, int, int, int, int>, 2, float>::type<>).name()) << endl << endl;
- cout << getReadableTypeinfo(typeid(fn<int*, int*, int*>).name()) << endl;
- cout << getReadableTypeinfo(typeid(changeType<fn<int*, int*, int*>, 1, int const*>::type<>).name()) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement