fork download
  1. #include <type_traits>
  2.  
  3. template<typename T>
  4. T* pointer_cast_impl(void* const p)
  5. {
  6. return static_cast<T*>(p);
  7. }
  8.  
  9. template<typename T>
  10. T const* pointer_cast_impl(void const* const p)
  11. {
  12. return static_cast<T const*>(p);
  13. }
  14.  
  15. template<typename T>
  16. T volatile* pointer_cast_impl(void volatile* const p)
  17. {
  18. return static_cast<T volatile*>(p);
  19. }
  20.  
  21. template<typename T>
  22. T const volatile* pointer_cast_impl(void const volatile* const p)
  23. {
  24. return static_cast<T const volatile*>(p);
  25. }
  26.  
  27. template<typename T, typename U>
  28. auto pointer_cast(U* const p) -> decltype((pointer_cast_impl<T>)(p))
  29. {
  30. static_assert(std::is_standard_layout<T>()
  31. && std::is_standard_layout<U>(),
  32. "T and U must both be standard layout types");
  33. static_assert(alignof(T) <= alignof(U),
  34. "T must not have stricter alignment than U");
  35. return (pointer_cast_impl<T>)(p);
  36. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
/usr/lib/gcc/i486-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty