fork(1) download
  1. #include <stdexcept>
  2. #include <iostream>
  3.  
  4. template <typename T>
  5. struct fibonacci_sequence
  6. {
  7. using value_type = T;
  8.  
  9. value_type operator()()
  10. {
  11. if (next < current)
  12. throw std::overflow_error("Overflow encountered in fibonacci_sequence.");
  13.  
  14. auto result = current;
  15.  
  16. auto next_in_series = current + next;
  17. current = next;
  18. next = next_in_series;
  19.  
  20. return result;
  21. }
  22.  
  23.  
  24. private:
  25. value_type current = 0;
  26. value_type next = 1;
  27. };
  28.  
  29. template <typename sequence>
  30. void largest_generated(sequence& seq)
  31. {
  32. typename sequence::value_type largest = 0;
  33.  
  34. try {
  35. for (;;)
  36. largest = seq();
  37. }
  38.  
  39. catch (std::exception& ex)
  40. {
  41. std::cout << ex.what() << '\n';
  42. std::cout << "Last value generated was " << largest << "\n\n";
  43. }
  44. }
  45.  
  46. int main()
  47. {
  48. fibonacci_sequence<int> int_seq;
  49. fibonacci_sequence<unsigned> unsigned_seq;
  50. fibonacci_sequence<unsigned long long> ull_seq;
  51.  
  52. largest_generated(int_seq);
  53. largest_generated(unsigned_seq);
  54. largest_generated(ull_seq);
  55. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Overflow encountered in fibonacci_sequence.
Last value generated was 1134903170

Overflow encountered in fibonacci_sequence.
Last value generated was 1836311903

Overflow encountered in fibonacci_sequence.
Last value generated was 7540113804746346429