#include <iostream>
#include <type_traits>
using std::cout;
using std::endl;
struct A { ~A() { cout << "~A" << endl; }};
struct B { ~B() { cout << "~B" << endl; }};
struct Base_holder {
virtual ~Base_holder() {}
};
template <class T>
struct Holder : Base_holder {
T value_;
Holder(T val) : value_{val} {}
};
struct Any {
std::aligned_storage_t<8> buffer_;
template <class T>
Any(T val)
{
new (&buffer_) Holder<T>{val};
}
~Any()
{
static_cast<Base_holder*>(static_cast<void*>(&buffer_))->~Base_holder();
}
};
auto main() -> int
{
Any a(A{});
Any b(B{});
cout << "--- Now we exit main ---" << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKCnN0cnVjdCBBIHsgfkEoKSB7IGNvdXQgPDwgIn5BIiA8PCBlbmRsOyB9fTsKc3RydWN0IEIgeyB+QigpIHsgY291dCA8PCAifkIiIDw8IGVuZGw7IH19OwoKc3RydWN0IEJhc2VfaG9sZGVyIHsKICB2aXJ0dWFsIH5CYXNlX2hvbGRlcigpIHt9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IEhvbGRlciA6IEJhc2VfaG9sZGVyIHsKICBUIHZhbHVlXzsKICAKICBIb2xkZXIoVCB2YWwpIDogdmFsdWVfe3ZhbH0ge30KfTsKCnN0cnVjdCBBbnkgewogIAogIHN0ZDo6YWxpZ25lZF9zdG9yYWdlX3Q8OD4gYnVmZmVyXzsKICAKICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBBbnkoVCB2YWwpCiAgewogICAgbmV3ICgmYnVmZmVyXykgSG9sZGVyPFQ+e3ZhbH07CiAgfQogIAogIH5BbnkoKQogIHsKICAgIHN0YXRpY19jYXN0PEJhc2VfaG9sZGVyKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KCZidWZmZXJfKSktPn5CYXNlX2hvbGRlcigpOwogIH0KfTsKCgphdXRvIG1haW4oKSAtPiBpbnQKewogIEFueSBhKEF7fSk7CiAgQW55IGIoQnt9KTsKICAKICBjb3V0IDw8ICItLS0gTm93IHdlIGV4aXQgbWFpbiAtLS0iIDw8IGVuZGw7Cn0K