#include <iostream>
int AOpen(const char*) { std::cout << "Aopen" << std::endl; return 0; }
void AClose(int) { std::cout << "Aclose" << std::endl; }
int BOpen(const char*) { std::cout << "Bopen" << std::endl; return 0; }
void BClose(int) { std::cout << "Bclose" << std::endl; }
template <typename H, H Open(const char*), void Close(H)>
class Wrapper
{
public:
Wrapper(const char* file) : h(Open(file)) {}
~Wrapper() { Close(h); }
Wrapper(const Wrapper&) = delete;
Wrapper& operator = (const Wrapper&) = delete;
private:
H h;
};
int main()
{
Wrapper<int, AOpen, AClose> wA("test");
Wrapper<int, BOpen, BClose> wB("test");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IEFPcGVuKGNvbnN0IGNoYXIqKSB7IHN0ZDo6Y291dCA8PCAiQW9wZW4iIDw8IHN0ZDo6ZW5kbDsgcmV0dXJuIDA7IH0Kdm9pZCBBQ2xvc2UoaW50KSB7IHN0ZDo6Y291dCA8PCAiQWNsb3NlIiA8PCBzdGQ6OmVuZGw7IH0KCmludCBCT3Blbihjb25zdCBjaGFyKikgeyBzdGQ6OmNvdXQgPDwgIkJvcGVuIiA8PCBzdGQ6OmVuZGw7IHJldHVybiAwOyB9CnZvaWQgQkNsb3NlKGludCkgeyBzdGQ6OmNvdXQgPDwgIkJjbG9zZSIgPDwgc3RkOjplbmRsOyB9CgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBILCBIIE9wZW4oY29uc3QgY2hhciopLCB2b2lkIENsb3NlKEgpPgpjbGFzcyBXcmFwcGVyCnsKcHVibGljOgogICAgV3JhcHBlcihjb25zdCBjaGFyKiBmaWxlKSA6IGgoT3BlbihmaWxlKSkge30KICAgIH5XcmFwcGVyKCkgeyBDbG9zZShoKTsgfQoKICAgIFdyYXBwZXIoY29uc3QgV3JhcHBlciYpID0gZGVsZXRlOwogICAgV3JhcHBlciYgb3BlcmF0b3IgPSAoY29uc3QgV3JhcHBlciYpID0gZGVsZXRlOwpwcml2YXRlOgogICAgSCBoOwp9OwoKaW50IG1haW4oKQp7CiAgICBXcmFwcGVyPGludCwgQU9wZW4sIEFDbG9zZT4gd0EoInRlc3QiKTsKICAgIFdyYXBwZXI8aW50LCBCT3BlbiwgQkNsb3NlPiB3QigidGVzdCIpOwp9Cg==