fork(4) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //-----
  5. typedef void* HANDLE;
  6. #define INVALID_HANDLE_VALUE ((HANDLE)(-1))
  7. HANDLE CreateFile(...) { return INVALID_HANDLE_VALUE; }
  8. HANDLE CreateFileMapping(HANDLE, ...) { return NULL; }
  9. void CloseHandle(HANDLE h) { std::cout << "closed: " << h << std::endl; }
  10. //-----
  11.  
  12. struct InvalidHandleTraits
  13. {
  14. using HandleType = HANDLE;
  15. static constexpr HANDLE DefaultHandle = INVALID_HANDLE_VALUE;
  16. //...
  17. static void Close(HANDLE h) { CloseHandle(h); }
  18. //...
  19. };
  20.  
  21. struct NullHandleTraits
  22. {
  23. using HandleType = HANDLE;
  24. static constexpr HANDLE DefaultHandle = NULL;
  25. //...
  26. static void Close(HANDLE h) { CloseHandle(h); }
  27. //...
  28. };
  29.  
  30. template<typename traits = InvalidHandleTraits>
  31. class HandleWrapper
  32. {
  33. public:
  34. using HandleType = typename traits::HandleType;
  35.  
  36. HandleWrapper(HandleType h = traits::DefaultHandle) : m_handle(h) { std::cout << "constructor: " << h << std::endl; }
  37. ~HandleWrapper() { traits::Close(m_handle); }
  38. //...
  39.  
  40. operator HandleType() { return m_handle; }
  41.  
  42. private:
  43. HandleType m_handle;
  44. };
  45.  
  46. int main()
  47. {
  48. HandleWrapper<> h1 = CreateFile();
  49. HandleWrapper<NullHandleTraits> h2 = CreateFileMapping(h1);
  50. return 0;
  51. }
Success #stdin #stdout 0s 4512KB
stdin
Standard input is empty
stdout
constructor: 0xffffffffffffffff
constructor: 0
closed: 0
closed: 0xffffffffffffffff