1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| namespace t2 {
struct SA { enum class Tag : int { STRING = 0, MY_CLASS, MY_CLASS_SPTR, }; const Tag tag; union { std::string c; MyT::MyClass d; std::shared_ptr<MyT::MyClass> e; }; SA() = delete; SA(const SA&) = delete; SA(const SA&&) = delete; SA& operator=(const SA&) = delete; SA& operator=(SA&&) = delete;
SA(Tag t) : tag(t) { switch (tag) { case Tag::STRING: new (&c) decltype(c); break; case Tag::MY_CLASS: new (&d) decltype(d); break; case Tag::MY_CLASS_SPTR: new (&e) decltype(e); break; default: assert(false); break; } }
virtual ~SA() { switch (tag) { case Tag::STRING: DestoryAt(c); break; case Tag::MY_CLASS: DestoryAt(d); break; case Tag::MY_CLASS_SPTR: DestoryAt(e); break; default: assert(false); break; } } }; TEST(adt, struct_type) { { SA myclass(SA::Tag::MY_CLASS); myclass.d.name = "SA"; LOG_DEBUG(myclass.d.ToString()); }
{ SA myclassPtr(SA::Tag::MY_CLASS_SPTR); myclassPtr.e = std::make_shared<decltype(myclassPtr.e)::element_type>(); myclassPtr.e->name = "SAP"; LOG_DEBUG(myclassPtr.e->ToString()); }
} }
|