Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблоны и всё о них 
:(
    Опции темы
stat007
Дата 1.3.2009, 00:14 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -1
Всего: -4



Всем привет!
Хочу изучить шаблоны, кто и что может посоветовать?
Какая вообще цель шаблонов в С++? где, когда и для чего используются? ну и т.д.
Вообщем поделитесь опытом в этом вопросе, непомешают примеры...
PM MAIL   Вверх
KaraKum
Дата 1.3.2009, 01:08 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Ну, самый популярный пример - это  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);

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


Это сообщение отредактировал(а) KaraKum - 1.3.2009, 01:17
PM MAIL WWW   Вверх
pan2004
Дата 1.3.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



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

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

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

чточто? smile 


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
KaraKum
Дата 1.3.2009, 01:21 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



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

Ну а я что сказал - с таким же успехом можно передавать указатель на void и размер этого типа.
PM MAIL WWW   Вверх
pan2004
Дата 1.3.2009, 01:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



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

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

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

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


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
KaraKum
Дата 1.3.2009, 01:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



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

Копировать и сравнивать по-байтово - но это изврат, поэтому и разработали шаблоны - надо узнать размер - sizeof().
PM MAIL WWW   Вверх
pan2004
Дата 1.3.2009, 01:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



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

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


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
knut
Дата 1.3.2009, 14:50 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



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


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.