| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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.... Синтаксис шаблона должен повторяться как при объявлении, так и при определении функции. Помните, шаблоны на самом деле являются макросами, поэтому они должны находиться в файлах .h. Если определение будет находиться в файле .срр, программа работать не будет (если только это не единственный файл .срр, в котором вызывается данная функция).
Определение генерируется компилятором при необходимости, то есть при вызове функции. На этот раз параметризовано имя функции, а не имя класса." |
| Автор: KaraKum 1.3.2009, 01:21 | ||
Ну а я что сказал - с таким же успехом можно передавать указатель на void и размер этого типа. |
| Автор: pan2004 1.3.2009, 01:24 | ||||
нифига. А как ты скопируешь объект, зная только его размер? Как сравнишь его с другим? Удалишь? Да никак. С POD типами это сработает, но никак не с объектами классов C++ Добавлено через 1 минуту и 6 секунд
проще не значит эффективно. |
| Автор: KaraKum 1.3.2009, 01:30 | ||
Копировать и сравнивать по-байтово - но это изврат, поэтому и разработали шаблоны - надо узнать размер - sizeof(). |
| Автор: pan2004 1.3.2009, 01:37 |
Еще раз: это не только изврат, с объектами такое в принципе не сработает. Всегда нужно вызывать конструктор-копировщик для копирования, и деструктор для уничтожения, да и как ты собрался побайтово сравнивать, к примеру даже указатель на массив символов(строку)? Для вызова нужных функций необходимо больше информации о типе, чем местоположение в памяти и размер. |
| Автор: knut 1.3.2009, 14:50 |
| stat007, лучше Николай Джосаттис,Дэвид Вандервуд тебе не кто не расскажет читай "Шаблоны С++. Справочник разработчика." а вот будут вопросы тут тебе точно помогут и на любой вопрос ответят |