#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;
}
