天天看點

基于C++實作的Any(需求:同一個map放入不同類型資料)

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

};
           

繼續閱讀