#include<type_traits>
class Any {
public:
Any& operator=(const Any& ref) = delete;
Any():base_(nullptr) {}
Any(Any&& ref):base_(nullptr){
base_ = ref.base_;
ref.base_ = nullptr;
};
Any& operator=(Any&& ref){
if (base_)
delete base_;
base_ = ref.base_;
ref.base_ = nullptr;
return *this;
};
~Any() {
if (base_)
delete base_;
base_ = nullptr;
}
const char* typeName() {
if (base_)
return base_->typeName();
return nullptr;
}
void swap(Any& oth) {
Base* data = oth.base_;
oth.base_ = base_;
base_ = data;
}
template<typename T>
void setValue(T t) {
if (base_)
delete base_;
base_ = new Data<T>(std::forward<T>(t));
}
template<typename T>
T value()const {
Data<T>* pdata = dynamic_cast<Data<T>*>(base_);
if (pdata)
return *pdata->t_;
else if (std::is_pointer<T>())
return nullptr;
else
return T();
};
private:
struct Base {
virtual const char* typeName() = 0;
virtual ~Base() {};
};
template<typename T>
struct Data :public Base {
Data(T t):t_(nullptr)
{
t_ = new T(std::forward<T>(t));
};
const char* typeName() {
return typeid(T).name();
}
void setData(const T& t) { t_ = std::forward<T>(t); }
T* t_;
};
private:
Base* base_;
};