#include
#include
#include
#include
#include
using namespace std;
struct Any{
? ? void * m_ptr;
? ? std::type_index m_type;
? ? std::function m_delete;
? ? template
? ? Any(T t) : m_type(type_index(typeid(T))) {
? ? ? ? T* obj = new typename decay::type(t);
? ? ? ? m_delete = [obj](){
? ? ? ? ? ? delete obj;
? ? ? ? };
? ? ? ? m_ptr =obj;
? ? }
? ? template
? ? T AnyCast()
? ? {
? ? ? ? return *static_cast(m_ptr);
? ? }
? ? template
? ? std::enable_if_t,void> operator = (Y& other) {
? ? ? ? if (other.m_type == this->m_type) {
? ? ? ? ? ? *static_cast::type*>(m_ptr) = *static_cast::type*>(other.m_ptr);
? ? ? ? } else {
? ? ? ? ? ? if (m_delete != nullptr)
? ? ? ? ? ? m_delete();
? ? ? ? ? ? auto obj = new typename decay::type(other);
? ? ? ? ? ? m_delete = [obj](){
? ? ? ? ? ? ? ? delete obj;
? ? ? ? ? ? };
? ? ? ? ? ? m_ptr =obj;
? ? ? ? ? ? m_type = type_index(typeid(Y));
? ? ? ? }
? ? ? ? return *this;
? ? }
? ? template
? ? std::enable_if_t,void> operator = (Y& other) {
? ? ? ? cout << "Hello World!" << endl;
? ? ? ? if (m_delete != nullptr)
? ? ? ? m_delete();
? ? ? ? auto obj = new typename decay::type(other);
? ? ? ? m_delete = [obj](){
? ? ? ? ? ? delete obj;
? ? ? ? };
? ? ? ? m_ptr =obj;
? ? ? ? m_type = type_index(typeid(Y));
? ? }
};
struct AA{
? ? int a = 1000;
};
int main()
{
? ? Any any(10);
? ? any = 1000;
? ? AA a;
? ? any = a;
? ? std::cout << any.AnyCast().a << std::endl;
? ? return 0;
}