#include <iostream>
using namespace std;
enum Type {
AType = 0,
BType,
CType,
};
void AOpen() { std::cout << "A open." << std::endl; }
void BOpen() { std::cout << "B open." << std::endl; }
void COpen() { std::cout << "C open." << std::endl; }
template<Type T>
class TypeWrapper {
public:
void open();
void close();
};
template<>
void TypeWrapper<AType>::open() { AOpen(); }
template<>
void TypeWrapper<BType>::open() { BOpen(); }
template<>
void TypeWrapper<CType>::open() { COpen(); }
int main() {
TypeWrapper<AType> wrapped_a;
TypeWrapper<BType> wrapped_b;
wrapped_a.open();
wrapped_b.open();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSBUeXBlIHsKCUFUeXBlID0gMCwKCUJUeXBlLAoJQ1R5cGUsCn07Cgp2b2lkIEFPcGVuKCkgeyBzdGQ6OmNvdXQgPDwgIkEgb3Blbi4iIDw8IHN0ZDo6ZW5kbDsgfQp2b2lkIEJPcGVuKCkgeyBzdGQ6OmNvdXQgPDwgIkIgb3Blbi4iIDw8IHN0ZDo6ZW5kbDsgfQp2b2lkIENPcGVuKCkgeyBzdGQ6OmNvdXQgPDwgIkMgb3Blbi4iIDw8IHN0ZDo6ZW5kbDsgfQoKdGVtcGxhdGU8VHlwZSBUPgpjbGFzcyBUeXBlV3JhcHBlciB7CglwdWJsaWM6Cgl2b2lkIG9wZW4oKTsKCXZvaWQgY2xvc2UoKTsKfTsKCnRlbXBsYXRlPD4Kdm9pZCBUeXBlV3JhcHBlcjxBVHlwZT46Om9wZW4oKSB7IEFPcGVuKCk7IH0KCnRlbXBsYXRlPD4Kdm9pZCBUeXBlV3JhcHBlcjxCVHlwZT46Om9wZW4oKSB7IEJPcGVuKCk7IH0KCnRlbXBsYXRlPD4Kdm9pZCBUeXBlV3JhcHBlcjxDVHlwZT46Om9wZW4oKSB7IENPcGVuKCk7IH0KCmludCBtYWluKCkgewoJVHlwZVdyYXBwZXI8QVR5cGU+IHdyYXBwZWRfYTsKCVR5cGVXcmFwcGVyPEJUeXBlPiB3cmFwcGVkX2I7Cgl3cmFwcGVkX2Eub3BlbigpOwoJd3JhcHBlZF9iLm9wZW4oKTsKCXJldHVybiAwOwp9