fork download
  1. #include <iostream>
  2. #include <utility>
  3. #include <memory>
  4.  
  5. template <typename V, typename T>
  6. char test(V&& v, T&& t, decltype( (t.*v)((int)0), 0 ) = 0)
  7. //char test(V&& v, T&& t, decltype( (t.*v)((int)0) )* = 0)
  8. { return 0; }
  9.  
  10. template <typename V, typename T>
  11. short test(V&& v, T&& t, decltype( (*t.*v)((int)0), 0 ) = 0)
  12. //short test(V&& v, T&& t, decltype( (*t.*v)((int)0) )* = 0)
  13. { return 0; }
  14.  
  15. long test(...) { return 0; }
  16.  
  17. namespace { int static_a; }
  18.  
  19. struct ichikawa {
  20. int fun1(int a) const { return 2*a; }
  21. int& fun2(int a) const { return static_a; }
  22. int&& fun3(int a) const { return (int&&)static_a; }
  23. };
  24.  
  25. int main() {
  26. ichikawa ic;
  27. std::unique_ptr<ichikawa> sp(new ichikawa);
  28. //int (ichikawa::*pF)(int)const = &ichikawa::fun1;
  29. //int& (ichikawa::*pF)(int)const = &ichikawa::fun2;
  30. int&& (ichikawa::*pF)(int)const = &ichikawa::fun3;
  31.  
  32. auto result1 = test(pF, ic);
  33. auto result2 = test(pF, &ic);
  34. auto result3 = test(pF, sp);
  35.  
  36. std::cout << sizeof(result1) << std::endl;
  37. std::cout << sizeof(result2) << std::endl;
  38. std::cout << sizeof(result3) << std::endl;
  39.  
  40. std::conditional< 0 < 2, int, char>::type nakamura;
  41. std::conditional< (0 > 3), int, char>::type kataoka;
  42.  
  43. return 0;
  44. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
1
2
2