fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4. #include <type_traits>
  5.  
  6. namespace detail
  7. {
  8. template<typename T>
  9. using enable_pointer = std::enable_if<std::is_pointer<T>::value, T>;
  10. }
  11.  
  12. template<typename T>
  13. auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(&(*data))>::type
  14. {
  15. return &(*data);
  16. }
  17.  
  18. template<typename T>
  19. auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.data())>::type
  20. {
  21. return data.data();
  22. }
  23.  
  24. template<typename T>
  25. auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.begin())>::type
  26. {
  27. return data.begin();
  28. }
  29.  
  30. template<typename T>
  31. auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.ptr())>::type
  32. {
  33. return data.ptr();
  34. }
  35.  
  36. using namespace std;
  37.  
  38. int main()
  39. {
  40. vector<int> v{1,2};
  41. auto i(++v.begin());
  42. unique_ptr<int> u(new int(3));
  43. initializer_list<int> l{4,5};
  44. const int * p = ptrOf(l) + 1;
  45.  
  46. cout << *ptrOf(v) << endl;
  47. cout << *ptrOf(i) << endl;
  48. cout << *ptrOf(u) << endl;
  49. cout << *ptrOf(l) << endl;
  50. cout << *ptrOf(p) << endl;
  51.  
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
1
2
3
4
5