#include <iostream>
#include <thread>
using namespace std;
struct Join {};
struct Detach {};
template <typename Action>
class Thread {
public:
Thread(thread && t) : th(move(t)) {}
~Thread()
{
if (th.joinable()) action(Action());
}
private:
thread th;
void action(Join)
{
th.join();
}
void action(Detach)
{
th.detach();
}
};
void work()
{
}
int main()
{
Thread<Join> t1(thread(work));
Thread<Detach> t2(thread(work));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEpvaW4ge307CnN0cnVjdCBEZXRhY2gge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uPgpjbGFzcyBUaHJlYWQgewpwdWJsaWM6CgoJVGhyZWFkKHRocmVhZCAmJiB0KSA6IHRoKG1vdmUodCkpIHt9CgoJflRocmVhZCgpCgl7CgkJaWYgKHRoLmpvaW5hYmxlKCkpIGFjdGlvbihBY3Rpb24oKSk7Cgl9Cgpwcml2YXRlOgoKCXRocmVhZCB0aDsKCgl2b2lkIGFjdGlvbihKb2luKQoJewoJCXRoLmpvaW4oKTsKCX0KCgl2b2lkIGFjdGlvbihEZXRhY2gpCgl7CgkJdGguZGV0YWNoKCk7Cgl9Cn07Cgp2b2lkIHdvcmsoKQp7Cn0KCmludCBtYWluKCkKewoJVGhyZWFkPEpvaW4+IHQxKHRocmVhZCh3b3JrKSk7CglUaHJlYWQ8RGV0YWNoPiB0Mih0aHJlYWQod29yaykpOwp9Cg==