Advertisement
RobertDeMilo

RB1.9 Вывод типов в шаблонах классов 2

Apr 15th, 2024 (edited)
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. нужен C++17
  2.  
  3. #include <iostream>
  4. #include <utility>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. // Пару итераторов представляем в виде шаблонного класса
  10. template<typename Iterator>
  11. class IteratorRange
  12. {
  13. private:
  14.     Iterator first, last;
  15.  
  16. public:
  17.     IteratorRange(Iterator f, Iterator l): first(f), last(l){}
  18.  
  19.     Iterator begin() const
  20.     {
  21.         return first;
  22.     }
  23.     Iterator end() const
  24.     {
  25.         return last;
  26.     }
  27. };
  28.  
  29. template<typename T>
  30. IteratorRange<typename vector<T>::iterator> Head(vector<T>& v, size_t top)
  31. {
  32.     // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
  33.     return { v.begin(), next(v.begin(), min(top,v.size())) };
  34. }
  35. // IteratorRange это не тип, это шаблон типа
  36. // чтобы из шаблона создать конкретный тип его нужно инстанцировать
  37. // IteratorRange<T> r - конкретный тип
  38.  
  39. template <typename T>
  40. size_t RangeSize(IteratorRange<T> r)
  41. {
  42.     return r.end() - r.begin();
  43. }
  44.  
  45. // Порождающая функция
  46. template <typename Iterator>
  47. IteratorRange<Iterator> MakeRange(Iterator begin, Iterator end)
  48. {
  49.     return IteratorRange<Iterator> {begin, end};
  50. }
  51.  
  52. int main()
  53. {
  54.     vector<int> v = { 1,2,3,4,5 };
  55.  
  56.     for (int& x : Head(v, 3))
  57.     {
  58.         ++x;
  59.     }
  60.  
  61.     for (int x : v)
  62.     {
  63.         cout << x << ' ';
  64.     }
  65.  
  66.     cout << endl;
  67.  
  68.     //1// IteratorRange <vector<int>::iterator> second_half{ v.begin() + v.size() / 2, v.end() };
  69.     //2// auto second_half = MakeRange(v.begin() + v.size() / 2, v.end());
  70.  
  71.     IteratorRange second_half(v.begin() + v.size() / 2, v.end()); //3//
  72.  
  73.     for (int x : second_half)
  74.     {
  75.         cout << x << ' ';
  76.     }
  77.  
  78.     pair<int, bool> p(5, true);
  79.     pair p1(5, true);// C++17
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement