fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <string>
  4.  
  5. using callback = auto (*)() -> void;
  6.  
  7. class foo_data final
  8. {
  9. public:
  10. operator callback() { return nullptr; }
  11. };
  12.  
  13. template <class Ty1, std::enable_if_t<
  14. std::is_pointer<Ty1>{}(), std::nullptr_t> = nullptr>
  15. auto foo(Ty1&&) { printf("redirect user data\n"); }
  16.  
  17. template <class Ty1>
  18. auto foo(std::nullptr_t) -> void { printf("nil\n"); }
  19.  
  20. template <class Ty1>
  21. auto foo(bool) -> void { printf("boolean\n"); }
  22.  
  23. template <class Ty1>
  24. auto foo(std::size_t) -> void { printf("integer\n"); }
  25.  
  26. template <class Ty1>
  27. auto foo(std::ptrdiff_t) -> void { printf("integer\n"); }
  28.  
  29. template <class Ty1>
  30. auto foo(double) -> void { printf("number\n"); }
  31.  
  32. template <class Ty1>
  33. auto foo(const char*) -> void { printf("native string\n"); }
  34.  
  35. template <class Ty1>
  36. auto foo(const std::string&) -> void { printf("C++ string\n"); }
  37.  
  38. template <class Ty1>
  39. auto foo(const void*) -> void { printf("user data\n"); }
  40.  
  41. int main()
  42. {
  43. // foo(nullptr);
  44.  
  45. // foo(true);
  46. // foo(false);
  47.  
  48. // std::uint8_t num_data = 10;
  49. // foo(100);
  50. // foo(-100);
  51. // foo(num_data);
  52.  
  53. // foo(1.4);
  54. // foo(-1.3f);
  55.  
  56. // foo("The text");
  57. // foo(std::string{});
  58.  
  59. // int* ptr_data = nullptr;
  60. // foo(ptr_data);
  61.  
  62. auto d = foo_data{};
  63. foo<decltype(d)>(d);
  64.  
  65. return 0;
  66. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
boolean