fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <type_traits>
  4.  
  5. template <typename T>
  6. struct SelectDeleter {
  7. void operator()(T* t) {
  8. std::cout << "generic deleter" << std::endl;
  9. delete t;
  10. }
  11. };
  12.  
  13. template <typename T>
  14. struct SelectDeleter<T[]> {
  15. void operator()(T* t) {
  16. std::cout << "array deleter" << std::endl;
  17. delete[] t;
  18. };
  19. };
  20.  
  21. template <typename T, typename Deleter = SelectDeleter<T>>
  22. struct foobar {
  23.  
  24. template <typename K>
  25. struct SelectPtr {
  26. using Ptr = K*;
  27. };
  28.  
  29. template <typename K>
  30. struct SelectPtr<K[]> {
  31. using Ptr = K*;
  32. };
  33.  
  34. using Ptr = typename SelectPtr<T>::Ptr;
  35.  
  36. foobar(Ptr p) : ptr(p) {
  37. }
  38.  
  39. ~foobar() {
  40. Deleter()(ptr);
  41. }
  42.  
  43. Ptr ptr;
  44. };
  45.  
  46. int main() {
  47. foobar<int> f1( new int(42) );
  48. foobar<int[]> f2( new int[42] );
  49. }
  50.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
array deleter
generic deleter