1 // PR c++/52744 2 // { dg-do compile { target c++11 } } 3 4 struct T 5 { 6 int a; bT7 void b(){} cT8 int c(int) 9 { 10 return 1; 11 } 12 }; 13 14 template<typename CT, CT> struct member_helper; 15 16 template<typename FT, FT(T::*mem)> 17 struct member_helper<FT(T::*), mem> 18 { 19 static const char* worker() 20 { 21 return "for members"; 22 } 23 }; 24 25 template<typename Return, typename... Args, Return(T::*fun)(Args...)> 26 struct member_helper<Return(T::*)(Args...), fun> 27 { 28 static const char* worker() 29 { 30 return "for member functions returning non void"; 31 } 32 }; 33 34 template<typename... Args, void(T::*fun)(Args...)> 35 struct member_helper<void(T::*)(Args...), fun> 36 { 37 static const char* worker() 38 { 39 return "for member functions returning void"; 40 } 41 }; 42 43 void member_test() 44 { 45 member_helper<decltype(&T::a), &T::a>::worker(); 46 member_helper<decltype(&T::b), &T::b>::worker(); 47 member_helper<decltype(&T::c), &T::c>::worker(); 48 } 49 50 typedef void lua_State; 51 52 template<typename T, T> class function_helper 53 { 54 static_assert(sizeof(T) != sizeof(T), 55 "Error: function_helper works with functions (duh)"); 56 }; 57 58 template<typename Return, typename... Args, Return(*func)(Args...)> 59 struct function_helper<Return(*)(Args...), func> 60 { 61 static int wrapper(lua_State* l) 62 { 63 return 1; 64 } 65 }; 66 67 template<typename... Args, void(*func)(Args...)> 68 struct function_helper<void(*)(Args...), func> 69 { 70 static int wrapper(lua_State* l) 71 { 72 return 0; 73 } 74 }; 75 76 int ciao(int){ return 0; } 77 void ciao2(int){} 78 79 void function_test() 80 { 81 function_helper<decltype(&ciao), &ciao>::wrapper(0); 82 function_helper<decltype(&ciao2), &ciao2>::wrapper(0); 83 } 84