#include <string>
#include <stack>
namespace exprtemplates
{
template <typename T> struct stack_indexer_expr
{
typedef std::stack<T> S;
S& s;
std::size_t n;
stack_indexer_expr(S& s, std::size_t n) : s(s), n(n) {}
operator T() const {
auto i = s.size()-n;
for (auto clone = s; !clone.empty(); clone.pop())
if (0 == --i) return clone.top();
}
operator std::string() const {
return std::to_string(this->operator T());
}
};
template <typename T> struct stack_expr
{
typedef std::stack<T> S;
S& s;
stack_expr(S& s) : s(s) {}
stack_indexer_expr<T> operator[](std::size_t n) const {
return { s, n };
}
};
}
template <typename T>
exprtemplates::stack_expr<T> extend(std::stack<T>& s) {
return { s };
}
#include <iostream>
int main()
{
std::stack<double> s;
s.push(0.5);
s.push(0.6);
s.push(0.7);
s.push(0.8);
std::string demo = extend(s)[3];
std::cout << demo << "\n";
// some more usage:
auto magic_stack = extend(s);
std::cout << magic_stack[0] << "\n";
std::cout << magic_stack[1] << "\n";
std::cout << magic_stack[2] << "\n";
std::cout << magic_stack[3] << "\n";
double as_double = magic_stack[0];
std::string as_string = magic_stack[0];
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0YWNrPgoKbmFtZXNwYWNlIGV4cHJ0ZW1wbGF0ZXMKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBzdGFja19pbmRleGVyX2V4cHIKICAgIHsKICAgICAgICB0eXBlZGVmIHN0ZDo6c3RhY2s8VD4gUzsKICAgICAgICBTJiBzOwogICAgICAgIHN0ZDo6c2l6ZV90IG47CiAgICAgICAgc3RhY2tfaW5kZXhlcl9leHByKFMmIHMsIHN0ZDo6c2l6ZV90IG4pIDogcyhzKSwgbihuKSB7fQoKICAgICAgICBvcGVyYXRvciBUKCkgY29uc3QgewogICAgICAgICAgICBhdXRvIGkgPSBzLnNpemUoKS1uOwogICAgICAgICAgICBmb3IgKGF1dG8gY2xvbmUgPSBzOyAhY2xvbmUuZW1wdHkoKTsgY2xvbmUucG9wKCkpCiAgICAgICAgICAgICAgICBpZiAoMCA9PSAtLWkpIHJldHVybiBjbG9uZS50b3AoKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QgewogICAgICAgICAgICByZXR1cm4gc3RkOjp0b19zdHJpbmcodGhpcy0+b3BlcmF0b3IgVCgpKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc3RhY2tfZXhwcgogICAgewogICAgICAgIHR5cGVkZWYgc3RkOjpzdGFjazxUPiBTOwogICAgICAgIFMmIHM7CiAgICAgICAgc3RhY2tfZXhwcihTJiBzKSA6IHMocykge30KCiAgICAgICAgc3RhY2tfaW5kZXhlcl9leHByPFQ+IG9wZXJhdG9yW10oc3RkOjpzaXplX3QgbikgY29uc3QgewogICAgICAgICAgICByZXR1cm4geyBzLCBuIH07CiAgICAgICAgfQogICAgfTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IApleHBydGVtcGxhdGVzOjpzdGFja19leHByPFQ+IGV4dGVuZChzdGQ6OnN0YWNrPFQ+JiBzKSB7CiAgICByZXR1cm4geyBzIH07Cn0KCiNpbmNsdWRlIDxpb3N0cmVhbT4KaW50IG1haW4oKQp7CiAgICBzdGQ6OnN0YWNrPGRvdWJsZT4gczsKICAgIHMucHVzaCgwLjUpOwogICAgcy5wdXNoKDAuNik7CiAgICBzLnB1c2goMC43KTsKICAgIHMucHVzaCgwLjgpOwoKICAgIHN0ZDo6c3RyaW5nIGRlbW8gPSBleHRlbmQocylbM107CiAgICBzdGQ6OmNvdXQgPDwgZGVtbyA8PCAiXG4iOwoKICAgIC8vIHNvbWUgbW9yZSB1c2FnZToKICAgIGF1dG8gbWFnaWNfc3RhY2sgPSBleHRlbmQocyk7CiAgICBzdGQ6OmNvdXQgPDwgbWFnaWNfc3RhY2tbMF0gPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCBtYWdpY19zdGFja1sxXSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IG1hZ2ljX3N0YWNrWzJdIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgbWFnaWNfc3RhY2tbM10gPDwgIlxuIjsKCiAgICBkb3VibGUgICAgICBhc19kb3VibGUgPSBtYWdpY19zdGFja1swXTsKICAgIHN0ZDo6c3RyaW5nIGFzX3N0cmluZyA9IG1hZ2ljX3N0YWNrWzBdOwp9Cg==