![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Изучаю по книге Уолтера Савитча "Язык С++. Курс ООП". Читаю шаблоны.
Хочу уточнить: 1. Шаблон - чисто косметическая фишка, чтобы программисту не приходилось переписывать перегруженную функцию для всех типов аргументов и их сочетаний. Так же листинг получается зрительно не перегруженным реализацией одной и той же функции. 2. Как все это выглядит в компиляторе? Программер написал код, скормил его компилеру. Тот увидел для себя директиву (это я просто сказал): template<class T>. Ага, значит наличиствуют перегруженные функции, классы. Он просматривает листинг, запоминает все функции, классы и прочее, где есть шаблонные аргументы. Затем сам создает все эти перегруженные структуры и добавляет в бинарник. То есть за программиста все сделал компилятор, листинг визуально не перегружен, а бинарник по размеру - как будто программист все это писал. И память выделяется как под функцию: функция вызвалась, под нее выделилась память, функция выполнилась - память освободилась. 3. Или шаблон похож на рекурсию? Т.е. под каждую шаблонную функцию выделяется новая память? И еще. Савитч пишет, что часто компиляторы не поддерживают прототипы шаблонов и раздельную его реализацию, т.е. до main пишешь заголовок функции и сразу реализацию. Но книга 2001 года. Насколько этот нюанс еще актуален? Это сообщение отредактировал(а) Gunslinger - 12.4.2007, 09:28 |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
поддерживать нужно одну реализацию, а не все варианты. Это не косметическая фишка, это - полиморфизм. когда компиллятор встречает вызов функции, он ищет эту функцию и если она оказывается шаблоном, генерит ее реализацию с такими типами аргументов, которые нужны. С классами аналогично.
не совсем так. Вызов шаблонной функции такойже как и обычной. Ничего не выделяется под функцию и не освобождается при каждом вызове.
В скомпиллированной программе шаблонные функции ничем от обычных не отличаются почти никто из компилляторов не поддерживает раздельные объявления и определения шаблонов. Хотя в стандарте это предусмотрено (ключевое слово export). Имеется в виду, что объявление и определение д.б. в одном файле, не обязательно идти подряд, но разносить в h и cpp можно только если этот шаблон используется только в этих же h и cpp. Подключить в какие-нибудь другие еденицы компилляции не получится Это сообщение отредактировал(а) Fazil6 - 12.4.2007, 10:22 |
||||
|
|||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Спасибо. Вопросов нет.
|
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 3 Всего: 8 |
Можно спокойно делать так.
Это сообщение отредактировал(а) HappyLife - 12.4.2007, 12:59 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Суммирую. Комипиляторы, которые есть на сегодняшний день, НЕ поддерживают разнесение интерфейса и реализации шаблонов. Это если предполагается использовать шаблоны в main'e. В противном случае можно. Как я понял, для этого противного случая HappyLife привел пример. Только зачем вручную перегружать функцию, если компилятор сделает это автоматически ("по требованию")?
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
vinter, в comeau, кажется... Только кто его использует, вот это вопрос...
|
|||
|
||||
| Xenon |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Раздельно можно, но не очень удобно
|
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
ну так это работает только, если мне заранее известно, какие типы будет подключать пользователь вместо шаблона. Как-то это неправильно, имхо. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
JackYF, Я и написал, что неудобно
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Xenon, а обьясни пожалуйста зачем при таком подходе, вообще шаблон нужен?
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
vinter, Как это зачем?
Я могу воплотить не только template class Foo<int>, могу и template class Foo<double> и template class Foo<Yo_Nigga>; и т.д. И будет класс как перегруженая функция - нужно явно указать типы, с которыми будет идти работа. Модель явного воплощения - средство языка, а не больное мое воображение |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Шаблоны вообще лучше применять только в разработке библиотек и программ для активного повторного использования.
Сильный энтузиазм может привести к неразберихе --------------------
|
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Так в чем сейчас стоит загвоздка? Компиляторы не поддерживают (или плохо реализуют) или это уже дело вкуса и читабельности кода?
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Экспорт компиляторы (за исключением одного) не поддерживают. точка.
|
|||
|
||||
| Goganchic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 678 Регистрация: 18.6.2004 Репутация: нет Всего: 5 |
Вообще я и многие мои знакомые активно используют шаблоны....
А главная загводка вот в чем: чем конструкция больше упрощает и сокращает код - тем проще в ней ошибиться. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Это как спроектируешь...
Возьми хотя бы бустовские шаблоны. Там компилируется == почти наверняка работает. -------------------- ... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Но уж если скомпилировалось А особенно любят бустовский код компиляторы. Допустишь маленькую ошибку... - и компилятор радостно выльет столько compile-error' ов... |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну это ты брось... код не работать может по-разному. А с шаблонами - на самом деле дело привычки. Если долго не используешь, то да, с первого раза правильно написать не всегда получается.
Зато знаешь как интуиция развивается -------------------- ... |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
О да. После экспериментов с boost::lambda и boost::bind |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |