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