Advertisement
Guest User

Untitled

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