#include <iostream>
template <typename T>
struct Atom
{
std::aligned_storage_t<sizeof(T), alignof(T)> storage;
template <typename... Args>
void initialize(Args&&... args)
{
new (&storage) T(std::forward<Args>(args)...);
}
T& get()
{
return *reinterpret_cast<T*>(&storage);
}
void destroy()
{
get().~T();
}
};
int main()
{
Atom<int> a;
a.initialize(1);
Atom<int> b;
b.initialize(2);
std::swap(a, b);
std::cout << a.get() << " " << b.get() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBBdG9tCnsKCXN0ZDo6YWxpZ25lZF9zdG9yYWdlX3Q8c2l6ZW9mKFQpLCBhbGlnbm9mKFQpPiBzdG9yYWdlOwoJdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Cgl2b2lkIGluaXRpYWxpemUoQXJncyYmLi4uIGFyZ3MpIAoJewoJCW5ldyAoJnN0b3JhZ2UpIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKCX0KCQoJVCYgZ2V0KCkKCXsKCQlyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCZzdG9yYWdlKTsKCX0KCQoJdm9pZCBkZXN0cm95KCkKCXsKCQlnZXQoKS5+VCgpOwoJfQp9OwoKaW50IG1haW4oKSAKewoJQXRvbTxpbnQ+IGE7CglhLmluaXRpYWxpemUoMSk7CgkKCUF0b208aW50PiBiOwoJYi5pbml0aWFsaXplKDIpOwoJCglzdGQ6OnN3YXAoYSwgYik7CgkKCXN0ZDo6Y291dCA8PCBhLmdldCgpIDw8ICIgIiA8PCBiLmdldCgpIDw8IHN0ZDo6ZW5kbDsKCQoJcmV0dXJuIDA7Cn0=