fork download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct T{
  6. int a;
  7. void b(){}
  8. 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. static string worker()
  19. {
  20. return "for members";
  21. }
  22. };
  23.  
  24. template<typename Return, typename... Args, Return(T::*fun)(Args...)>
  25. struct member_helper<Return(T::*)(Args...), fun> {
  26. static string worker()
  27. {
  28. return "for member functions returning non void";
  29. }
  30. };
  31.  
  32. template<typename... Args, void(T::*fun)(Args...)>
  33. struct member_helper<void(T::*)(Args...), fun> {
  34. static string worker()
  35. {
  36. return "for member functions returning void";
  37. }
  38. };
  39.  
  40. int main() {
  41. cout << member_helper<decltype(&T::a), &T::a>::worker() << endl; //prints for members, ok
  42. cout << member_helper<decltype(&T::b), &T::b>::worker() << endl; //cannot distinguish between all of the three
  43. cout << member_helper<decltype(&T::c), &T::c>::worker() << endl; //cannot distinguish between member function returning non void and member
  44. }
  45.  
Success #stdin #stdout 0s 2960KB
stdin
Standard input is empty
stdout
for members
for member functions returning void
for member functions returning non void