fork download
  1. #include <string>
  2. #include <stack>
  3.  
  4. namespace exprtemplates
  5. {
  6. template <typename T> struct stack_indexer_expr
  7. {
  8. typedef std::stack<T> S;
  9. S& s;
  10. std::size_t n;
  11. stack_indexer_expr(S& s, std::size_t n) : s(s), n(n) {}
  12.  
  13. operator T() const {
  14. auto i = s.size()-n;
  15. for (auto clone = s; !clone.empty(); clone.pop())
  16. if (0 == --i) return clone.top();
  17. }
  18.  
  19. operator std::string() const {
  20. return std::to_string(this->operator T());
  21. }
  22. };
  23.  
  24. template <typename T> struct stack_expr
  25. {
  26. typedef std::stack<T> S;
  27. S& s;
  28. stack_expr(S& s) : s(s) {}
  29.  
  30. stack_indexer_expr<T> operator[](std::size_t n) const {
  31. return { s, n };
  32. }
  33. };
  34. }
  35.  
  36. template <typename T>
  37. exprtemplates::stack_expr<T> extend(std::stack<T>& s) {
  38. return { s };
  39. }
  40.  
  41. #include <iostream>
  42. int main()
  43. {
  44. std::stack<double> s;
  45. s.push(0.5);
  46. s.push(0.6);
  47. s.push(0.7);
  48. s.push(0.8);
  49.  
  50. std::string demo = extend(s)[3];
  51. std::cout << demo << "\n";
  52.  
  53. // some more usage:
  54. auto magic_stack = extend(s);
  55. std::cout << magic_stack[0] << "\n";
  56. std::cout << magic_stack[1] << "\n";
  57. std::cout << magic_stack[2] << "\n";
  58. std::cout << magic_stack[3] << "\n";
  59.  
  60. double as_double = magic_stack[0];
  61. std::string as_string = magic_stack[0];
  62. }
  63.  
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
0.800000
0.5
0.6
0.7
0.8