#include <iostream>
using namespace std;
class A {
public:
A() {}
~A() { cout << "A Destructor"; }
};
template<typename Type>
class TemplateTest {
protected:
Type* start;
Type* end;
Type* iter;
public:
void Generate(unsigned int count) {
start = new Type[count];
end = start + count;
iter = start;
}
void DestroyAll() {
for(; start < end; ++start) {
(*start).~Type();
}
}
void Push(Type val) {
*iter = val;
iter++;
}
};
int main() {
cout << "Non-pointer test" << endl;
TemplateTest<A> npt;
npt.Generate(5);
npt.DestroyAll();
cout << "\nPointer test";
TemplateTest<A*> pt;
pt.Generate(5);
pt.Push(new A());
pt.DestroyAll();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQSB7CnB1YmxpYzoKCUEoKSB7fQoJfkEoKSB7IGNvdXQgPDwgIkEgRGVzdHJ1Y3RvciI7IH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+CmNsYXNzIFRlbXBsYXRlVGVzdCB7CnByb3RlY3RlZDoKCVR5cGUqIHN0YXJ0OwoJVHlwZSogZW5kOwoJVHlwZSogaXRlcjsKcHVibGljOgoJdm9pZCBHZW5lcmF0ZSh1bnNpZ25lZCBpbnQgY291bnQpIHsKCQlzdGFydCA9IG5ldyBUeXBlW2NvdW50XTsKCQllbmQgPSBzdGFydCArIGNvdW50OwoJCWl0ZXIgPSBzdGFydDsKCX0KCXZvaWQgRGVzdHJveUFsbCgpIHsKCQlmb3IoOyBzdGFydCA8IGVuZDsgKytzdGFydCkgewoJCQkoKnN0YXJ0KS5+VHlwZSgpOwoJCX0KCX0KCXZvaWQgUHVzaChUeXBlIHZhbCkgewoJCSppdGVyID0gdmFsOwoJCWl0ZXIrKzsKCX0KfTsKCmludCBtYWluKCkgewoJY291dCA8PCAiTm9uLXBvaW50ZXIgdGVzdCIgPDwgZW5kbDsKCVRlbXBsYXRlVGVzdDxBPiBucHQ7CglucHQuR2VuZXJhdGUoNSk7CglucHQuRGVzdHJveUFsbCgpOwoJCgljb3V0IDw8ICJcblBvaW50ZXIgdGVzdCI7CglUZW1wbGF0ZVRlc3Q8QSo+IHB0OwoJcHQuR2VuZXJhdGUoNSk7CglwdC5QdXNoKG5ldyBBKCkpOwoJcHQuRGVzdHJveUFsbCgpOwoJCglyZXR1cm4gMDsKfQ==