#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