Advertisement
RobertDeMilo

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

Apr 15th, 2024
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. // Порождающие функции
  2. // Преимущества - сокращают код, перекладывая на компилятор вывод
  3. // параметров шаблона
  4.  
  5. // Недостатки - их нужно писать самому.
  6.  
  7. // auto full = MakeRange(t.begin(),t.end()) - неочевиден тип переменной full
  8. #include <iostream>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. // Пару итераторов представляем в виде шаблонного класса
  14. template<typename Iterator>
  15. struct IteratorRange
  16. {
  17.     Iterator first, last;
  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.     /*IteratorRange <vector<int>::iterator> second_half{ v.begin() + v.size() / 2, v.end() };*/
  69.     auto second_half = MakeRange(v.begin() + v.size() / 2, v.end());
  70.     for (int x : second_half)
  71.     {
  72.         cout << x << ' ';
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement