Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. template<typename T, typename R, typename... Args>
  2. constexpr bool ckeck_method_type() {
  3.     char const* sig = __FUNCSIG__;
  4.     while (*sig++ != '<') {}
  5.     char const* f_type = sig;
  6.     while (*sig != '\0') { sig++; }
  7.     while (*sig-- != '>') {}
  8.     while (*sig-- != ')') {}
  9.     char const* t_args = sig + 3;
  10.     while(true) {
  11.         if(*f_type == '(') {
  12.             if(*t_args == ',' || *t_args == '>') {
  13.                 break;
  14.             }
  15.             return false;
  16.         }
  17.         if(*t_args == ',' || *t_args == '>') {
  18.             if(*f_type == '(') {
  19.                 break;
  20.             }
  21.             return false;
  22.         }
  23.         if(*t_args != *f_type) {
  24.             return false;
  25.         }
  26.         t_args++;
  27.         f_type++;
  28.     }
  29.     while (*f_type++ != ')') {}
  30.     f_type++;
  31.     if(f_type[0] == 'v' && f_type[1] == 'o' && f_type[2] == 'i' && f_type[3] == 'd' && f_type[4] == ')') {
  32.         if(t_args[0] == ',' && t_args[1] == '>') {
  33.             return true;
  34.         }
  35.         return false;
  36.     }
  37.     t_args++;
  38.     while(true) {
  39.         if(f_type[0] == 's' && f_type[1] == 't' && f_type[2] == 'r' && f_type[3] == 'u' && f_type[4] == 'c' && f_type[5] == 't' && f_type[6] == ' ') {
  40.             if(t_args[0] == 's' && t_args[1] == 't' && t_args[2] == 'r' && t_args[3] == 'u' && t_args[4] == 'c' && t_args[5] == 't') {
  41.                 f_type += 7;
  42.                 // msvc bug
  43.                 if(t_args[6] == ' ') {
  44.                     t_args += 7;
  45.                 } else {
  46.                     t_args += 6;
  47.                 }
  48.             } else {
  49.                 return false;
  50.             }
  51.         }
  52.         if(f_type[0] == 'c' && f_type[1] == 'l' && f_type[2] == 'a' && f_type[3] == 's' && f_type[4] == 's' && f_type[5] == ' ') {
  53.             if(t_args[0] == 'c' && t_args[1] == 'l' && t_args[2] == 'a' && t_args[3] == 's' && t_args[4] == 's') {
  54.                 f_type += 6;
  55.                 // msvc bug
  56.                 if(t_args[5] == ' ') {
  57.                     t_args += 6;
  58.                 } else {
  59.                     t_args += 5;
  60.                 }
  61.             } else {
  62.                 return false;
  63.             }
  64.         }
  65.         if(*f_type == ')') {
  66.             if(*t_args == '>') {
  67.                 return true;
  68.             }
  69.             return false;
  70.         }
  71.         if(*t_args != *f_type) {
  72.             if(f_type[0] == ' ' && f_type[1] == '&' && t_args[0] == '&') {
  73.                 f_type++;
  74.             } else {
  75.                 return false;
  76.             }
  77.         }
  78.         t_args++;
  79.         f_type++;
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement