fork download
  1. // intIO.hpp
  2.  
  3. #ifndef INTIO_H
  4. #define INTIO_H
  5.  
  6. #include <istream>
  7. #include <ostream>
  8. #include <type_traits>
  9. #include <limits>
  10.  
  11. template
  12. <class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
  13. class integer_IO
  14. {
  15. T &val;
  16.  
  17. public:
  18.  
  19. integer_IO(T &arg) : val(arg) {}
  20. integer_IO(T &&arg) : val(arg) {}
  21.  
  22. friend std::istream &operator>> (std::istream &is, integer_IO<T> &&i)
  23. {
  24. using TT = decltype(+i.val);
  25. TT hlp;
  26. is >> hlp;
  27. TT constexpr minval = static_cast<TT>(std::numeric_limits<T>::min());
  28. TT constexpr maxval = static_cast<TT>(std::numeric_limits<T>::max());
  29. i.val = static_cast<T>(hlp > maxval ? maxval : hlp < minval ? minval : hlp);
  30. if(hlp > maxval || hlp < minval)
  31. is.setstate(std::ios::failbit);
  32. return is;
  33. }
  34.  
  35. friend std::ostream &operator<< (std::ostream &os, integer_IO<T> const &&i)
  36. {
  37. os << +i.val;
  38. return os;
  39. }
  40. };
  41.  
  42. template
  43. <class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
  44. integer_IO<T> intIO(T &arg)
  45. {
  46. return integer_IO<T>(arg);
  47. }
  48.  
  49. template
  50. <class T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
  51. integer_IO<T> intIO(T &&arg)
  52. {
  53. return integer_IO<T>(arg);
  54. }
  55.  
  56. #endif
  57.  
  58. // main.cpp
  59.  
  60. #include <iostream>
  61. #include <cstdint>
  62. // #include "intIO.hpp"
  63. using namespace std;
  64.  
  65. int dwaplusdwa()
  66. {
  67. return 2+2;
  68. }
  69.  
  70. int main()
  71. {
  72. int_least8_t i;
  73. cin >> intIO(i);
  74. cout << intIO(i) << '\n';
  75. cout << intIO(dwaplusdwa()) << '\n';
  76. }
Success #stdin #stdout 0s 3460KB
stdin
128
stdout
127
4