fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. class C
  5. {
  6. private:
  7. class integral {};
  8. class floatingpoint {};
  9. class cstring {};
  10.  
  11. template<bool sw, typename T1, typename T2>
  12. using Sel = typename std::conditional<sw, T1, T2>::type;
  13.  
  14. template<typename T>
  15. using Sel2 = Sel<std::is_convertible<T, char const*>::value, cstring, void>;
  16. template<typename T>
  17. using Sel1 = Sel<std::is_floating_point<T>::value, floatingpoint, Sel2<T>>;
  18. template<typename T>
  19. using SelectOverload = Sel<std::is_integral<T>::value, integral, Sel1<T>>;
  20.  
  21. public:
  22. template<typename T, typename Overload = SelectOverload<T>>
  23. explicit C(T&& value)
  24. {
  25. init(std::forward<T>(value), Overload());
  26. }
  27.  
  28. private:
  29. template<typename T>
  30. void init(T&& value, integral)
  31. {
  32. std::cout << "integral" << std::endl;
  33. }
  34.  
  35. template<typename T>
  36. void init(T&& value, floatingpoint)
  37. {
  38. std::cout << "floating point" << std::endl;
  39. }
  40.  
  41. template<typename T>
  42. void init(T&& value, cstring)
  43. {
  44. std::cout << "cstring" << std::endl;
  45. }
  46. };
  47.  
  48. int main()
  49. {
  50. C z(0);
  51. C a(1);
  52. C b(1.0);
  53. C c("");
  54. }
  55.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
integral
integral
floating point
cstring