fork download
  1. #include <type_traits>
  2. #include <iostream>
  3.  
  4. template<typename TDerived> class
  5. t_ImplicitlyConvertableToAnything
  6. {
  7. public: template
  8. <
  9. typename TTarget
  10. , typename TEnabled = typename ::std::enable_if_t<::std::is_integral<TTarget>::value>
  11. >
  12. operator TTarget(void) const
  13. {
  14. auto const & self{static_cast<const TDerived &>(*this)};
  15. return(self.template CheckedConversion_To_Integral<TTarget>());
  16. }
  17. };
  18.  
  19. template<typename TDerived> class
  20. t_ExplicitlyConvertableToAnything
  21. {
  22. public: template
  23. <
  24. typename TTarget
  25. , typename TEnabled = typename ::std::enable_if_t<!::std::is_integral<TTarget>::value>
  26. > explicit
  27. operator TTarget(void) const
  28. {
  29. auto const & self{static_cast<const TDerived &>(*this)};
  30. return(self.template CheckedConversion_To_NonIntegral<TTarget>());
  31. }
  32. };
  33.  
  34. class
  35. t_ConvertableToAnything
  36. : public t_ImplicitlyConvertableToAnything<t_ConvertableToAnything>
  37. , public t_ExplicitlyConvertableToAnything<t_ConvertableToAnything>
  38. {
  39. public: template<typename TTarget> decltype(auto)
  40. CheckedConversion_To_Integral(void) const
  41. {
  42. return(static_cast<TTarget>(1));
  43. }
  44.  
  45. public: template<typename TTarget> decltype(auto)
  46. CheckedConversion_To_NonIntegral(void) const
  47. {
  48. return(static_cast<TTarget>(3.14));
  49. }
  50. };
  51.  
  52.  
  53. int main()
  54. {
  55. t_ConvertableToAnything c;
  56. ::std::cout << ([](int x){return(x);})(c) << ::std::endl;
  57. ::std::cout << static_cast<float>(c) << ::std::endl;
  58. return(0);
  59. }
  60.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
1
3.14