Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12
  1. #1
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±

    [Цикл уроков программиста] 16.Шаблоны (templates): шаблонные классы и функции в C++

    Последний урок в вводном курсе С++

    Шаблоны (templates) - очень мощное средство. Шаблонные функции и классы позволяют очень сильно упростить программисту жизнь и сберечь огромное количество времени, сил и нервов. Если вам покажется, что шаблоны не сильно-то и значимая тема для изучения, знайте - вы заблуждаетесь.
    Шаблонные функции

    Простой пример шаблонной функции:
    PHP код:
    Type square (Type a)
    {
      
    Type b;
      
    a*a;
      return 
    b;
    }

    int x 5;
    int i;

    square(5);

    float y 0.5;
    float f;

    square(y); 
    Если бы мы создавали функции по старинке, то тогда бы пришлось писать две разные функции: для типа int и для типа float. А если бы понадобилась такая же функция, использующая другие типы, пришлось бы заново писать и её. Используя шаблоны, можно ограничиться только одним экземпляром функции, оставив всю грязную работу компилятору.

    Вместо использования какого-то определённого типа, в функции используется параметрический тип (или по другому - аргумент шаблона). Здесь я обозвал параметрический тип идентификатором Type. В функции этот идентификатор встречается три раза: возвращаемое значение, аргумент функции и определение переменной b. То есть Type используется как любой обычный тип.

    Но чтобы код заработал, перед функцией нужно добавить следующую строку (я показал несколько вариантов синтаксиса, все они рабочие):
    PHP код:
    template <class TypeType square (Type a)

    template <class Type>
    Type square (Type a)

    template< class Type >
    Type square (Type a)

    template < class Type Type square (Type a
    Итак, перед функцией должно стоять ключевое слово template (шаблон), а в угловых скобках нужно указать имя параметрического типа с ключевым словом class. Вместо ключевого слова class можно использовать type - в общем-то никакой разницы.

    Идентификатор параметрического типа тоже может быть любым. Мы часто будем пользоваться вот такими: TypeA, TypeB, Datatype, T.

    Важное замечание: У шаблонных функций должен быть аргумент, чтобы компилятор мог определить какой именно тип использовать.

    В шаблонах можно использовать несколько параметрических типов, и конечно же можно смешивать параметрические типы со стандартными (только нужно позаботиться о правильном приведении типов). Приведу пример в котором используется два параметрических типа TypeA, TypeB и базовый тип int:
    PHP код:
    template <class TypeA, class TypeB>
    TypeB example_function (TypeA aTypeB b)
    {
      
    int x 5;
      
    x;
      return 
    b;

    Но шаблонные функции - не самое интересное, что мы сегодня рассмотрим.
    Шаблонные классы

    В общем-то шаблонные классы создаются почти так же как и шаблонные функции - перед именем класса записывается ключевое слово template. Шаблонные классы рассмотрим на примере стека:
    PHP код:
    template <class Type>
    class 
    stack
    {
    private:
      
    int top;
      
    Type s[10];

    public:
      
    stack (): top(0)
      {}

      
    void push(Type var)
      {
        
    top++;
        
    s[top] = var;
      }

      
    Type pop();
    };

    template <class Type>
    Type stack<Type>::pop()
    {
      
    Type var = s[top];
      
    top--;
      return var;

    Здесь мы определили стек из десяти элементов. Эти элементы могут быть какого угодно типа, об этом чуть-чуть ниже.

    Единственное на что хочу обратить ваше внимание: определение функций push и pop. Функция push определена внутри класса, а функция pop - снаружи. Для всех функции объявлённых за пределами класса, нужно обязательно указывать ключевое слово template. Выражение перед именем функции совпадает с тем, которое указывается перед именем класса.

    Теперь посмотрим как работать с шаблонными классами:
    PHP код:
    stack<ints1;
    stack<floats2;

    s1.push(3);
    s1.push(2);
    s1.pop();

    s2.push(0.5); 
    При создании объекта, после имени класса нужно поставить угловые скобки, в которых указать нужный тип. После этого объекты используются так, как мы привыкли.

    У шаблонных классов есть одна потрясающая особенность - кроме стандартных типов, они могут работать и с пользовательскими. Рассмотрим небольшой пример. Для этого определим простой класс warrior:
    PHP код:
    class warrior
    {
    public:
      
    int health;
      
    warrior () : health(0) {}
    };

    stack<warriors;

    warrior w1;
    warrior w2;
    warrior w3;

    s.push(w1);
    s.push(w3);

    s.pop();
    s.push(w2); 
    Смотрите, теперь в стеках можно размещать переменные типа warrior!!! Возможно вы не поверите мне, но это очень круто!

    По шаблонам пока всё. Позже разберём более сложные случаи использования шаблонных классов.
    Упражнения

    Напишите шаблонный класс для очереди. Код обычной очереди вы можете взять в упражнении 1
    Последний раз редактировалось bredvix; 25.02.2014 в 17:54.

  2. Пользователь сказал cпасибо:
    Osetin (31.07.2013)
  3. #2
    Аватар для #MAVRIN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.06.2013
    Сообщений
    170
    Репутация:
    70 ±
    фейк

  4. #3
    Аватар для Will_Winston
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2013
    Сообщений
    120
    Репутация:
    3 ±
    Естественно :)

  5. #4
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±
    Цитата Сообщение от MAVRIN Посмотреть сообщение
    фейк
    Цитата Сообщение от Will_Winston Посмотреть сообщение
    Естественно :)
    Схуяли вы это так решили?

  6. #5
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±
    Не фейк,настоящий))

  7. #6
    Аватар для Will_Winston
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2013
    Сообщений
    120
    Репутация:
    3 ±
    Да фейк это...

  8. #7
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±
    Цитата Сообщение от Will_Winston Посмотреть сообщение
    Да фейк это...
    А доказать можешь? Или кроме голословных заявлений ты ни на что более не способен?

  9. Пользователь сказал cпасибо:
    Osetin (31.07.2013)
  10. #8
    Аватар для Will_Winston
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2013
    Сообщений
    120
    Репутация:
    3 ±
    Что мне доказвать? Думаешь что пишешь? Это ты должен доказать....

  11. #9
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±
    Цитата Сообщение от Will_Winston Посмотреть сообщение
    Что мне доказвать? Думаешь что пишешь? Это ты должен доказать....
    Может это ты подумаешь?
    Презумпция невиновности. Ты не можешь доказать что я фейк - значит я настоящий.

  12. #10
    Аватар для Drive666
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    30.03.2013
    Адрес
    СССР
    Сообщений
    213
    Репутация:
    67 ±
    Цитата Сообщение от Will_Winston Посмотреть сообщение
    Что мне доказвать? Думаешь что пишешь? Это ты должен доказать....
    Ты и должен доказать что он фейк,раз уж обвиняешь его!!
    Последний раз редактировалось Drive666; 31.07.2013 в 12:59.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •