Advertisement
Guest User

Untitled

a guest
Aug 9th, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. #include <memory>
  2.  
  3. struct COMDeleter {
  4. template<typename T> void operator()(T* ptr) {
  5. ptr->Release();
  6. }
  7. };
  8. template<typename T, typename Del> struct PointerToPointerToUniquePointer {
  9. PointerToPointerToUniquePointer(std::unique_ptr<T, Del>* unique) {
  10. ptr = unique;
  11. t_ptr = nullptr;
  12. }
  13. std::unique_ptr<T, Del>* ptr;
  14. T* t_ptr;
  15. operator T**() {
  16. return &t_ptr;
  17. }
  18. ~PointerToPointerToUniquePointer() {
  19. *ptr = std::unique_ptr<T, Del>(t_ptr);
  20. }
  21. };
  22. template<typename T, typename Del> PointerToPointerToUniquePointer<T, Del> PointerToPointer(std::unique_ptr<T, Del>& arg) {
  23. return PointerToPointerToUniquePointer<T, Del>(&arg);
  24. }
  25.  
  26. int main() {
  27. IDirect3DDevice9* p = ...; // ignore device & it's refcount for now
  28. std::unique_ptr<IDirect3DTexture9, COMDeleter> tex;
  29. p->CreateTexture(..., PointerToPointer(tex)); // all is good.
  30. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement