Шаблоны. Специализации шаблонов класса в С++.

Иногда могут встретится случаи, в которых может иметь место зависимость работы методов классов, от различных типов данных. Для корректировки неверного поведения такого вида методов, существует возможность специализации шаблонов класса.

  • Чтобы специализировать шаблон класса, следует объявить класс, предварив его конструкцией template<>, и указать типы, для которых специализируется шаблон класса. Типы используются в качестве аргументов шаблона и задаются непосредственно после имени класса.

Например, я хочу сложить два значения. В случае с числом, сложением является сумма чисел, а в случае со строкой под сложением можно понимать объединение строк. Вначале написания кода не должно возникнуть проблем

Так вот, этот пример прекрасно работает и складывает 2 значения. Но если его слегка дополнить, изменить main

Для Си строк нет перегруженного оператора сложения, так как нельзя написать непосредственно std::cout<<"Hello" + "Bye", то такая конструкция и не сработает. Чтобы решить такую незадачку, нужно помочь компилятору, научить его тому, как он должен себя вести. Так как тема, описываемая мною сейчас — это тема "Шаблоны в С++", то и будем придерживаться шаблонов. Так вот, один из вариантов помощи компилятору, это специализировать метод класса или сам класс. Предпочтительнее специализировать класс, чем отдельный его метод. Но начнем с того, что попроще.

  • Чтобы специализировать шаблон класса, следует объявить класс, предварив его конструкцией template<>, и указать типы, для которых специализируется шаблон класса.
  • Типы используются в качестве аргументов шаблона и задаются непосредственно после имени класса.

Похожее правило и для метода класса. Пример специализации отдельного метода.

Этот пример в самую первую очередь должен заставлять задавать вопрос: "Где очистка?" А вот нету очистки памяти. А чтобы почистить память в данном случае, нужно возиться и придумывать себе что-то. Это одна из причин того, что при специализации шаблона класса необходимо специализировать все его функции-члены.

Другая причина специализации всего класса в том, что хотя и можно специализировать отдельную функцию-член, после этого нельзя будет специализировать целый класс.

  • При специализации шаблона класса необходимо специализировать все его функции-члены.

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

В этом примере уже нет утечки, потому как при уничтожении объекта класса сработает деструктор, в котором и проводится необходимая очистка после выделения из new. Теперь не надо извивать свои извилины в поисках оптимального хода.

Для тех кто не знаком с конструктором по умолчанию, хоть и пояснял, но еще раз поясняю
MyClass::MyClass(int a, int b):x(a),y(b){};
означает, что в приватное поле класса MyClass в переменную x будет записано значение, пришедшее как а и в y соответственно b.

Остается надеяться, что эта тема оказалась полезной.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Последние комментарии

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок