#include <deque>
#include <list>
// デフォルトコンストラクタが無い
class A {
public:
A(int n) : n(n) {}
private:
int n;
A();
};
template <class T, class Container = std::deque<T> >
class stack {
public:
void push() { rep.push_back(T()); }
void push(const T& v) { rep.push_back(v); }
T top() { rep.back(); }
void pop() { rep.pop_back(); }
private:
Container rep;
};
int main(void) {
stack<A> s1;
stack<int> s2;
stack<A*> s3; // ポリモーフィックな型でもOK
stack<int, std::list<int> > s4; // 図6.9相当の実装に置換
// デフォルトコンストラクタを必要とするメソッドを呼ばない限りはOK
//s1.push(); // error!
s1.push(A(1));
s1.top();
s1.pop();
s2.push();
s2.push(2);
s2.top();
s2.pop();
return 0;
}
I2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8bGlzdD4KCi8vIOODh+ODleOCqeODq+ODiOOCs+ODs+OCueODiOODqeOCr+OCv+OBjOeEoeOBhApjbGFzcyBBIHsKcHVibGljOgogICAgQShpbnQgbikgOiBuKG4pIHt9CnByaXZhdGU6CiAgICBpbnQgbjsKICAgIEEoKTsgCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGFpbmVyID0gc3RkOjpkZXF1ZTxUPiA+CmNsYXNzIHN0YWNrIHsKcHVibGljOgogICAgdm9pZCBwdXNoKCkgICAgICAgICAgIHsgcmVwLnB1c2hfYmFjayhUKCkpOyB9CiAgICB2b2lkIHB1c2goY29uc3QgVCYgdikgeyByZXAucHVzaF9iYWNrKHYpOyB9CiAgICAgICBUIHRvcCgpICAgICAgICAgICAgeyByZXAuYmFjaygpOyB9CiAgICB2b2lkIHBvcCgpICAgICAgICAgICAgeyByZXAucG9wX2JhY2soKTsgfQpwcml2YXRlOgogICAgQ29udGFpbmVyIHJlcDsKfTsKCmludCBtYWluKHZvaWQpIHsKICAgIHN0YWNrPEE+IHMxOwogICAgc3RhY2s8aW50PiBzMjsKICAgIHN0YWNrPEEqPiBzMzsgLy8g44Od44Oq44Oi44O844OV44Kj44OD44Kv44Gq5Z6L44Gn44KCT0sKICAgIHN0YWNrPGludCwgc3RkOjpsaXN0PGludD4gPiBzNDsgLy8g5ZuzNi4555u45b2T44Gu5a6f6KOF44Gr572u5o+bCiAKICAgIC8vIOODh+ODleOCqeODq+ODiOOCs+ODs+OCueODiOODqeOCr+OCv+OCkuW/heimgeOBqOOBmeOCi+ODoeOCveODg+ODieOCkuWRvOOBsOOBquOBhOmZkOOCiuOBr09LCiAgICAvL3MxLnB1c2goKTsgLy8gZXJyb3IhCiAgICBzMS5wdXNoKEEoMSkpOwogICAgczEudG9wKCk7CiAgICBzMS5wb3AoKTsKICAgIAogICAgczIucHVzaCgpOwogICAgczIucHVzaCgyKTsgIAogICAgczIudG9wKCk7CiAgICBzMi5wb3AoKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K