#include <iostream>
#include <thread>
using namespace std;
class Thread {
public:
typedef void (thread::*Action)();
Thread(thread && t, Action a) : th(move(t)), pAction(a) {}
~Thread()
{
if (th.joinable()) (th.*pAction)();
}
private:
Action pAction;
thread th;
};
void work()
{
}
int main()
{
Thread t1(thread(work), &thread::join);
Thread t2(thread(work), &thread::detach);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVGhyZWFkIHsKcHVibGljOgoKCXR5cGVkZWYgdm9pZCAodGhyZWFkOjoqQWN0aW9uKSgpOwoKCVRocmVhZCh0aHJlYWQgJiYgdCwgQWN0aW9uIGEpIDogdGgobW92ZSh0KSksIHBBY3Rpb24oYSkge30KCgl+VGhyZWFkKCkKCXsKCQlpZiAodGguam9pbmFibGUoKSkgKHRoLipwQWN0aW9uKSgpOwoJfQoKcHJpdmF0ZToKCglBY3Rpb24gcEFjdGlvbjsKCXRocmVhZCB0aDsKfTsKCnZvaWQgd29yaygpCnsKfQoKaW50IG1haW4oKQp7CglUaHJlYWQgdDEodGhyZWFkKHdvcmspLCAmdGhyZWFkOjpqb2luKTsgCglUaHJlYWQgdDIodGhyZWFkKHdvcmspLCAmdGhyZWFkOjpkZXRhY2gpOwp9Cg==