fork download
  1. #include <stdexcept>
  2. #include <iostream>
  3.  
  4. struct vapour_pressure
  5. {
  6. enum status_t { nonsense, unknown, known, saturated } ;
  7.  
  8. vapour_pressure() = default ;
  9. vapour_pressure( double v) { *this = v ; }
  10.  
  11. vapour_pressure& operator= ( double v )
  12. {
  13. value = v ;
  14. if( value < 0 ) status = nonsense ;
  15. // else if ...
  16. else status = known ;
  17. return *this ;
  18. }
  19.  
  20. operator double() const
  21. {
  22. if( status == nonsense ) throw std::domain_error("nonsense") ;
  23. if( status == unknown ) throw std::domain_error("unknown") ;
  24.  
  25. return value ;
  26. }
  27.  
  28. bool valid() const { return status == known || status == saturated ; }
  29.  
  30. operator bool () const { return valid() && value ; }
  31. bool operator! () const { return !bool(*this) ; }
  32.  
  33. // etc.
  34.  
  35. private:
  36. double value ;
  37. status_t status = unknown ;
  38. // ...
  39.  
  40. friend std::ostream& operator<< ( std::ostream& stm, const vapour_pressure& vp )
  41. {
  42. if( vp.status == vapour_pressure::unknown ) return stm << "unknown" ;
  43. else if( vp.status == vapour_pressure::nonsense ) return stm << "nonsense" ;
  44. else if( vp.status == vapour_pressure::saturated ) return stm << "saturated" ;
  45. else return stm << vp.value ;
  46. }
  47. };
  48.  
  49. int main()
  50. {
  51. vapour_pressure vp ;
  52. std::cout << "vapour pressure is: " << vp << '\n' ;
  53. if(vp) { double val = vp ; /* ... */ }
  54.  
  55. vp = 23.4 ;
  56. std::cout << "vapour pressure is: " << vp << '\n' ;
  57. if( vp.valid() ) { double psi = double(vp) * 14.5038 ; /* ... */ }
  58.  
  59. vp = -3 ;
  60. std::cout << "vapour pressure is: " << vp << '\n' ;
  61. }
  62.  
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
vapour pressure is: unknown
vapour pressure is: 23.4
vapour pressure is: nonsense