02-required.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Use a non-ignorable value with expected.
  2. #include "nonstd/expected.hpp"
  3. #include <iostream>
  4. using namespace nonstd;
  5. template< typename T >
  6. class required
  7. {
  8. public:
  9. required( T const & value)
  10. : content( value ) {}
  11. required( required && other )
  12. : content( other.content )
  13. , ignored( other.ignored )
  14. {
  15. other.ignored = false;
  16. }
  17. required( required const & other ) = delete;
  18. ~required() noexcept( false )
  19. {
  20. if ( ignored )
  21. throw std::runtime_error("required: content unobserved");
  22. };
  23. T const & operator *() const { ignored = false; return content; }
  24. private:
  25. T content;
  26. mutable bool ignored = true;
  27. };
  28. template< typename T >
  29. auto make_required( T value ) -> required<T>
  30. {
  31. return required<T>( std::move(value) );
  32. }
  33. using unused_type = char;
  34. auto produce( int value ) -> expected< required<int>, unused_type >
  35. {
  36. return make_required( std::move(value) );
  37. }
  38. int main( int argc, char * argv[] )
  39. {
  40. try
  41. {
  42. auto er42 = produce( 42 );
  43. auto er13 = produce( 13 );
  44. std::cout << "value: " << **er42 << "\n";
  45. }
  46. catch ( std::exception const & e )
  47. {
  48. std::cout << "Error: " << e.what();
  49. }
  50. }
  51. // cl -EHsc -wd4814 -Zc:implicitNoexcept- -I../include 02-required.cpp && 02-required.exe
  52. // g++ -std=c++14 -Wall -I../include -o 02-required.exe 02-required.cpp && 02-required.exe
  53. // value: 42
  54. // Error: required: content unobserved