Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ObjWrap {
- public:
- template <typename T>
- ObjWrap(T O) : Self(new Obj<T>(std::move(O))) {}
- template <typename T>
- friend typename T * getObjPtr(ObjWrap O) {
- return static_cast<T*>(O.Self->getObjPtr_());
- }
- private:
- struct Concept {
- virtual ~Concept() = 0;
- virtual void* getObjPtr_() = 0;
- };
- template <typename T>
- struct Obj : Concept {
- Obj(T O) : Data(std::move(O)) {}
- void* getObjPtr_() { return static_cast<void*>(&Data); }
- T Data;
- };
- std::unique_ptr<Concept> Self;
- };
- ObjWrap a(1);
- ObjWrap b(std::string("b"));
- int* p_a = getObjPtr<int>(a);
- std::string* p_b = getObjPtr<std::string>(b);
- template <typename T>
- class ObjWrap {
- /* ... */
- };
- ObjWrap<int> a(1); // this is no good for type erasure.
Add Comment
Please, Sign In to add comment