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