Guest User

Untitled

a guest
Aug 14th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.75 KB | None | 0 0
  1. class ObjWrap {
  2. public:
  3. template <typename T>
  4. ObjWrap(T O) : Self(new Obj<T>(std::move(O))) {}
  5.  
  6. template <typename T>
  7. friend typename T * getObjPtr(ObjWrap O) {
  8. return static_cast<T*>(O.Self->getObjPtr_());
  9. }
  10. private:
  11. struct Concept {
  12. virtual ~Concept() = 0;
  13. virtual void* getObjPtr_() = 0;
  14. };
  15. template <typename T>
  16. struct Obj : Concept {
  17. Obj(T O) : Data(std::move(O)) {}
  18. void* getObjPtr_() { return static_cast<void*>(&Data); }
  19.  
  20. T Data;
  21. };
  22.  
  23. std::unique_ptr<Concept> Self;
  24. };
  25.  
  26. ObjWrap a(1);
  27. ObjWrap b(std::string("b"));
  28. int* p_a = getObjPtr<int>(a);
  29. std::string* p_b = getObjPtr<std::string>(b);
  30.  
  31. template <typename T>
  32. class ObjWrap {
  33. /* ... */
  34. };
  35.  
  36. ObjWrap<int> a(1); // this is no good for type erasure.
Add Comment
Please, Sign In to add comment