做好档案整理及网站建设,西部数码网站管理助手,桂林企业网,网站建设精美模板c17引入了any 和 variant#xff0c;可以将任意数据类型统一用any或variant类型表示#xff0c;在开发中还是能够带来很多便利的。在c11版本中#xff0c;可以用下面这个例子#xff0c;仿照实现一个Any类型。
#include iostream
#include stdexcept
#inc…c17引入了any 和 variant可以将任意数据类型统一用any或variant类型表示在开发中还是能够带来很多便利的。在c11版本中可以用下面这个例子仿照实现一个Any类型。
#include iostream
#include stdexcept
#include memoryclass UserData{
public:UserData(){}std::string operator()(){return m_name;}
private:std::string m_nameworld;
};class Any
{
public:templatetypename TAny(const T val) noexcept : content(new HolderT(val)) {}Any(const Any other) noexcept : content(other.content ? other.content-Copy() : nullptr) {}Any(Any other) noexcept :content(std::move(other.content)) {}Any operator(const Any other){if (this other)return *this;content.reset(other.content ? other.content-Copy() : nullptr);return *this;}templatetypename TT get() const{if (content.get() nullptr){throw std::exception_ptr();}if (typeid(T).hash_code() ! content-TypeID()){throw std::bad_cast();}return static_castHolderT*(content.get())-value;}std::string TypeName() const{if (content)return content-TypeName();return ;}size_t TypeID(){if (content)return content-TypeID();return 0;}
private:struct Base {virtual ~Base() {}virtual Base* Copy() const 0;virtual size_t TypeID() const 0;virtual const char* TypeName() const 0;};templatetypename Tstruct Holder :public Base{HolderT() delete;HolderT(const T val) : value(val), typid(typeid(T).hash_code()), typname(typeid(T).name()) {}~HolderT() {}Base* Copy() const override { return new HolderT(value); }size_t TypeID() const override { return typid; }const char* TypeName() const override { return typname; }T value;size_t typid;const char* typname;};std::unique_ptrBase content;
};int main()
{int iVal 10;Any param iVal;int iv param.getint();iv 100;std::coutparam.TypeName(), valparam.getint()std::endl;std::string sValhello;param sVal;std::coutparam.TypeName(), valparam.getstd::string()std::endl;double dVal 101.21;Any paramd dVal;param paramd;std::coutparam.TypeName(), valparam.getdouble()std::endl;UserData data;param data;UserData dt param.getUserData();std::coutparam.TypeName(), valdt()std::endl;return 0;
}