Advertisement
zhangsongcui

Change Type

Jan 8th, 2012
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <cxxabi.h>
  4. #include <cstdlib>
  5. #include <string>
  6.  
  7. std::string getReadableTypeinfo(const char* info)
  8. {
  9.     int status;
  10.     char* s=abi::__cxa_demangle(info, /*nullptr*/NULL, /*nullptr*/NULL, &status);
  11.     if (status != 0)
  12.         return "Invalid argument";
  13.     std::string result = s;
  14.     free(s);
  15.     return result;
  16. }
  17.  
  18. using namespace std;
  19.  
  20. // using size_t = decltype(sizeof(0));
  21.  
  22. template <typename OldType, size_t index, typename NewType>
  23. struct changeType;
  24.  
  25. template <template <typename... Args> class OldType, size_t index, typename NewType, typename ArgType, typename... Others>
  26. struct changeType<OldType<ArgType, Others...>, index, NewType>
  27. {
  28.     template <typename... Types>
  29.     using type = typename changeType<OldType<Others...>, index-1, NewType>::template type<Types..., ArgType>;
  30. };
  31.  
  32. template <template <typename... Args> class OldType, typename NewType, typename ArgType, typename... Others>
  33. struct changeType<OldType<ArgType, Others...>, 0, NewType>
  34. {
  35.     template <typename... Types>
  36.     using type = typename changeType<OldType<Others...>, size_t(-1), NewType>::template type<Types..., NewType>;
  37. };
  38.  
  39. template <template <typename... Args> class OldType, size_t index, typename NewType>
  40. struct changeType<OldType<>, index, NewType>
  41. {
  42.     template <typename... Types>
  43.     using type = OldType<Types...>;
  44. };
  45.  
  46. template <typename... T>
  47. struct fn
  48. {
  49.  
  50. };
  51.  
  52. int main() {
  53.     cout << getReadableTypeinfo(typeid(fn<int, int, int, int, int>).name()) << endl;
  54.     cout << getReadableTypeinfo(typeid(changeType<fn<int, int, int, int, int>, 2, float>::type<>).name()) << endl << endl;
  55.  
  56.     cout << getReadableTypeinfo(typeid(fn<int*, int*, int*>).name()) << endl;
  57.     cout << getReadableTypeinfo(typeid(changeType<fn<int*, int*, int*>, 1, int const*>::type<>).name()) << endl;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement