#include <string>
#include <vector>
#include <iostream>
template <class T>
class Inventory
{
public:
void operator += (const T& b) { backpack.push_back(b); }
T operator [] (const unsigned& b)
{
try
{
return backpack.at(b);
}
catch (std::out_of_range& e)
{
throw std::string("Out of Range");
}
}
void operator -= (const unsigned& b)
{
try
{
backpack.at(b);
backpack.erase(backpack.begin() + b);
}
catch(std::out_of_range& e)
{
throw std::string("No such element exists.");
}
}
private:
std::vector<int> backpack;
};
using namespace std;
int main()
{
Inventory<int> pack;
pack += 2;
pack += 4;
try
{
cout << "It was " << pack[0] << endl;
cout << "It was " << pack[1] << endl;
pack -= 0;
cout << "It is now " << pack[0] << endl;
pack -= 1; // Segfaults?
}
catch (string e)
{
cout << "Error: " << e << endl;
}
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIEludmVudG9yeQp7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBvcGVyYXRvciArPSAoY29uc3QgVCYgYikgICB7IGJhY2twYWNrLnB1c2hfYmFjayhiKTsgfQoKICAgICAgICBUIG9wZXJhdG9yIFtdIChjb25zdCB1bnNpZ25lZCYgYikKICAgICAgICB7CiAgICAgICAgICAgIHRyeSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICByZXR1cm4gYmFja3BhY2suYXQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKHN0ZDo6b3V0X29mX3JhbmdlJiBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT3V0IG9mIFJhbmdlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZvaWQgb3BlcmF0b3IgLT0gKGNvbnN0IHVuc2lnbmVkJiBiKQogICAgICAgIHsKICAgICAgICAJdHJ5IAogICAgICAgIAl7CiAgICAgICAgCQliYWNrcGFjay5hdChiKTsKICAgICAgICAgICAgICAgIGJhY2twYWNrLmVyYXNlKGJhY2twYWNrLmJlZ2luKCkgKyBiKTsKICAgICAgICAJfQogICAgICAgIAljYXRjaChzdGQ6Om91dF9vZl9yYW5nZSYgZSkKICAgICAgICAJewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk5vIHN1Y2ggZWxlbWVudCBleGlzdHMuIik7CiAgICAgICAgCX0KICAgICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGJhY2twYWNrOwp9OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkKewogICAgSW52ZW50b3J5PGludD4gcGFjazsKICAgIHBhY2sgKz0gMjsKICAgIHBhY2sgKz0gNDsKICAgIHRyeQogICAgewogICAgICAgIGNvdXQgPDwgIkl0IHdhcyAiIDw8IHBhY2tbMF0gPDwgZW5kbDsKICAgICAgICBjb3V0IDw8ICJJdCB3YXMgIiA8PCBwYWNrWzFdIDw8IGVuZGw7CiAgICAgICAgcGFjayAtPSAwOwogICAgICAgIGNvdXQgPDwgIkl0IGlzIG5vdyAiIDw8IHBhY2tbMF0gPDwgZW5kbDsKICAgICAgICBwYWNrIC09IDE7IC8vIFNlZ2ZhdWx0cz8KICAgIH0KICAgIGNhdGNoIChzdHJpbmcgZSkKICAgIHsKICAgICAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBlIDw8IGVuZGw7CiAgICB9Cn0=