Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > шаблоны и всё о них


Автор: stat007 1.3.2009, 00:14
Всем привет!
Хочу изучить шаблоны, кто и что может посоветовать?
Какая вообще цель шаблонов в С++? где, когда и для чего используются? ну и т.д.
Вообщем поделитесь опытом в этом вопросе, непомешают примеры...

Автор: KaraKum 1.3.2009, 01:08
Ну, самый популярный пример - это  STL (vector, deque, list...).
Коротко говоря, шаблоны используются когда заранее неизвестно переменные каких размеров (в байтах) будут использоваться.
В моём небольшом опыте не приходилось создавать шаблонные классы и, думаю, никогда не придётся - всё что требуется всегда пока находилось в STL - и почти наверняка так всегда и будет.
А если шаблонные классы начинают создаваться уже НЕ для организации хранения и доступа к переменных этого типа, то это, наверняка, уже плохой стиль программирования, потому что в таких случаях почти всегда можно решить имеющуюся задачу гораздо проще.

Добавлено @ 01:13
Ну и вот описание из книги:

"Синтаксис шаблонов
Если вы собираетесь использовать шаблоны, привыкайте к тому, что в вашей речи будет часто звучать
термин параметризованный (parameterized). Шаблоны используются для создания параметризованных
типов (обычно классов) и параметризованных функций.
Параметризованные типы
Параметризованный тип внешне представляет собой обычное объявление класса, которому
предшествует магическое заклинание template <c1ass Type>, где Type — выбранное вами
символическое имя (остальные элементы задаются жестко). Всюду, где символическое имя Type (или
другое имя) встречается в объявлении класса оно интерпретируется как макрос, вместо которого при
использовании класса подставляется конкретный тип. Класс ListNode, переписанный как
параметризованный тип, выглядит следующим образом:
Код

      template <class Type>
      class ListNode {
      private:
            ListNode<Type>* next;
            Type* data;
      public:
            ListNode(Type* d, ListNode<Type>* n = NULL) : next(n), data(d) {}
            ~ListNode() { delete next; }
            Type* Data() { return data; }
            ListNode<Type>* Next() { return next; }
      };
      ListNode<Foo> list = new ListNode<Foo> (new Foo);
      Foo* f = list->Data();            // Возвращает правильный тип

В теле объявления класса формальный параметр шаблона резервирует место, на которое при
использовании класса подставляется фактический параметр. При этом компилятор буквально
генерирует правильный, безопасный по отношению к типам код.
Параметризованные функции
Параметризованные функции объявляются точно так же — перед их объявлениями указывается
формула template.... Синтаксис шаблона должен повторяться как при объявлении, так и при
определении функции. Помните, шаблоны на самом деле являются макросами, поэтому они должны
находиться в файлах .h. Если определение будет находиться в файле .срр, программа работать не будет
(если только это не единственный файл .срр, в котором вызывается данная функция).
Код

     // Объявление функции
     template <class Type>
     Type* fn(Type* t);
     // Определение ее реализации
     template <class Type>
     Type* fn(Type* t) {
           // Тело функции, в котором имя Type
           // используется в качестве параметра макроса
     }
     Foo* f = fn<Foo>(new Foo);

Определение генерируется компилятором при необходимости, то есть при вызове функции. На этот раз
параметризовано имя функции, а не имя класса."

Автор: pan2004 1.3.2009, 01:16
Цитата(KaraKum @  1.3.2009,  01:08 Найти цитируемый пост)
шаблоны используются когда заранее неизвестно переменные каких размеров (в байтах) будут использоваться.

что за ?
Шаблоны используются как средство параметризации типов(например в STL параметры шаблонов указывают типы хранимых в контейнерах объектов, или способ аллокации памяти). Ну и так же в качестве средства переложить часть задач на compile time.

Цитата(KaraKum @  1.3.2009,  01:08 Найти цитируемый пост)
А если шаблонные классы начинают создаваться уже НЕ для организации их хранения и доступа

чточто? smile 

Автор: KaraKum 1.3.2009, 01:21
Цитата(pan2004 @ 1.3.2009,  02:16)
Шаблоны используются как средство параметризации типов(например в STL параметры шаблонов указывают типы хранимых в контейнерах объектов, или способ аллокации памяти).

Ну а я что сказал - с таким же успехом можно передавать указатель на void и размер этого типа.

Автор: pan2004 1.3.2009, 01:24
Цитата(KaraKum @  1.3.2009,  01:21 Найти цитируемый пост)
с таким же успехом можно передавать указатель на void и размер этого типа.

нифига. А как ты скопируешь объект, зная только его размер? Как сравнишь его с другим? Удалишь? Да никак.
С POD типами это сработает, но никак не с объектами классов C++

Добавлено через 1 минуту и 6 секунд
Цитата(KaraKum @  1.3.2009,  01:08 Найти цитируемый пост)
потому что в таких случаях почти всегда можно решить имеющуюся задачу гораздо проще.

проще не значит эффективно.

Автор: KaraKum 1.3.2009, 01:30
Цитата(pan2004 @  1.3.2009,  02:24 Найти цитируемый пост)
нифига. А как ты скопируешь объект, зная только его размер? Как сравнишь его с другим? Удалишь? Да никак.

Копировать и сравнивать по-байтово - но это изврат, поэтому и разработали шаблоны - надо узнать размер - sizeof().

Автор: pan2004 1.3.2009, 01:37
Цитата(KaraKum @  1.3.2009,  01:30 Найти цитируемый пост)
Копировать и сравнивать по-байтово - но это изврат

Еще раз: это не только изврат, с объектами такое в принципе не сработает. Всегда нужно вызывать конструктор-копировщик для копирования, и деструктор для уничтожения, да и как ты собрался побайтово сравнивать, к примеру даже указатель на массив символов(строку)? Для вызова нужных функций необходимо больше информации о типе, чем местоположение в памяти и размер.

Автор: knut 1.3.2009, 14:50
stat007, 
лучше Николай Джосаттис,Дэвид Вандервуд тебе не кто не расскажет читай "Шаблоны С++. Справочник разработчика."
а вот будут вопросы тут тебе точно помогут и на любой вопрос ответят
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)