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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблоны, уточнения 
:(
    Опции темы
Gunslinger
Дата 12.4.2007, 09:24 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Изучаю по книге Уолтера Савитча "Язык С++. Курс ООП". Читаю шаблоны.
Хочу уточнить:
1. Шаблон - чисто косметическая фишка, чтобы программисту не приходилось переписывать перегруженную функцию для всех типов аргументов и их сочетаний. Так же листинг получается зрительно не перегруженным реализацией одной и той же функции.
2. Как все это выглядит в компиляторе? Программер написал код, скормил его компилеру. Тот увидел для себя директиву (это я просто сказал): template<class T>. Ага, значит наличиствуют перегруженные функции, классы. Он просматривает листинг, запоминает все функции, классы и прочее, где есть шаблонные аргументы. Затем сам создает все эти перегруженные структуры и добавляет в бинарник. То есть за программиста все сделал компилятор, листинг визуально не перегружен, а бинарник по размеру - как будто программист все это писал. И память выделяется как под функцию: функция вызвалась, под нее выделилась память, функция выполнилась - память освободилась.
3. Или шаблон похож на рекурсию? Т.е. под каждую шаблонную функцию выделяется новая память?

И еще. Савитч пишет, что часто компиляторы не поддерживают прототипы шаблонов и раздельную его реализацию, т.е. до main пишешь заголовок функции и сразу реализацию. Но книга 2001 года. Насколько этот нюанс еще актуален?

Это сообщение отредактировал(а) Gunslinger - 12.4.2007, 09:28
PM MAIL   Вверх
Fazil6
Дата 12.4.2007, 10:18 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Gunslinger @  12.4.2007,  09:24 Найти цитируемый пост)
1. Шаблон - чисто косметическая фишка, чтобы программисту не приходилось переписывать перегруженную функцию для всех типов аргументов и их сочетаний. Так же листинг получается зрительно не перегруженным реализацией одной и той же функции.

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


Цитата(Gunslinger @  12.4.2007,  09:24 Найти цитируемый пост)
 Как все это выглядит в компиляторе? Программер написал код, скормил его компилеру. Тот увидел для себя директиву (это я просто сказал): template<class T>. Ага, значит наличиствуют перегруженные функции, классы. Он просматривает листинг, запоминает все функции, классы и прочее, где есть шаблонные аргументы. Затем сам создает все эти перегруженные структуры и добавляет в бинарник.

когда компиллятор встречает вызов функции, он ищет эту функцию и если она оказывается шаблоном, генерит ее реализацию с такими типами аргументов, которые нужны. С классами аналогично.

Цитата(Gunslinger @  12.4.2007,  09:24 Найти цитируемый пост)
 И память выделяется как под функцию: функция вызвалась, под нее выделилась память, функция выполнилась - память освободилась.

не совсем так. Вызов шаблонной функции такойже как и обычной. Ничего не выделяется под функцию и не освобождается при каждом вызове.



Цитата(Gunslinger @  12.4.2007,  09:24 Найти цитируемый пост)
3. Или шаблон похож на рекурсию? Т.е. под каждую шаблонную функцию выделяется новая память?

В скомпиллированной программе шаблонные функции ничем от обычных не отличаются 

Цитата(Gunslinger @  12.4.2007,  09:24 Найти цитируемый пост)
И еще. Савитч пишет, что часто компиляторы не поддерживают прототипы шаблонов и раздельную его реализацию, т.е. до main пишешь заголовок функции и сразу реализацию. Но книга 2001 года. Насколько этот нюанс еще актуален?

почти никто из компилляторов не поддерживает раздельные объявления и определения шаблонов. Хотя в стандарте это предусмотрено (ключевое слово export). Имеется в виду, что объявление и определение д.б. в одном файле, не обязательно идти подряд, но разносить в h и cpp можно только если этот шаблон используется только в этих же h и cpp. Подключить в какие-нибудь другие еденицы компилляции не получится 


Это сообщение отредактировал(а) Fazil6 - 12.4.2007, 10:22
PM MAIL   Вверх
Gunslinger
Дата 12.4.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Спасибо. Вопросов нет.
PM MAIL   Вверх
HappyLife
Дата 12.4.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно спокойно делать так.
Код

//-------temp.h----------

template<class T> T mythebestfunc(T t);

//--------temp.cpp-----------

string mythebestfunc(string t)
{

}

int mythebestfunc(int t)
{

}


Это сообщение отредактировал(а) HappyLife - 12.4.2007, 12:59
PM MAIL   Вверх
Daevaorn
Дата 12.4.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(HappyLife @  12.4.2007,  13:58 Найти цитируемый пост)
Можно спокойно делать так.

и что?
PM MAIL WWW   Вверх
Gunslinger
Дата 12.4.2007, 13:18 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Суммирую. Комипиляторы, которые есть на сегодняшний день, НЕ поддерживают разнесение интерфейса и реализации шаблонов. Это если предполагается использовать шаблоны в main'e. В противном случае можно. Как я понял, для этого противного случая HappyLife привел пример. Только зачем вручную перегружать функцию, если компилятор сделает это автоматически ("по требованию")?
PM MAIL   Вверх
vinter
Дата 12.4.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Gunslinger @  12.4.2007,  13:18 Найти цитируемый пост)
Суммирую. Комипиляторы, которые есть на сегодняшний день, НЕ поддерживают разнесение интерфейса и реализации шаблонов.

вроде где-то export есть..


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 12.4.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



vinter, в comeau, кажется... Только кто его использует, вот это вопрос...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 12.4.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Раздельно можно, но не очень удобно
Код

//Foo.h
#pragma once
template <class T>
class Foo
{
public:
    T data;
    void display();
    Foo(T _data);
};

Код

//Foo.cpp
#include "Foo.h"

template class Foo<int>;

template <class T>
void Foo<T>::display()
{
    std::cout << data;
}
template <class T>
Foo<T>::Foo(T _data):data(_data){}

Код

//main.cpp
#include <iostream>
#include "Foo.h"
int main(int argc, char* argv[])
{
    Foo<int> foo(10);
    foo.display();
    return 0;
}



--------------------
user posted image  
PM MAIL   Вверх
JackYF
Дата 12.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Xenon @  12.4.2007,  16:51 Найти цитируемый пост)
template class Foo<int>;


ну так это работает только, если мне заранее известно, какие типы будет подключать пользователь вместо шаблона. Как-то это неправильно, имхо.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 12.4.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



JackYF, Я и написал, что неудобно smile Но иногда по-другому не лучше. С другой стороны так можно запретить создание некоторых типов, но это некрасиво smile


--------------------
user posted image  
PM MAIL   Вверх
vinter
Дата 12.4.2007, 18:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Xenon, а обьясни пожалуйста зачем при таком подходе, вообще шаблон нужен?


--------------------
Мой блог
PM MAIL WWW   Вверх
Xenon
Дата 12.4.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



vinter, Как это зачем?
Я могу воплотить не только template class Foo<int>, могу и template class Foo<double> и template class Foo<Yo_Nigga>; и т.д. И будет класс как перегруженая функция - нужно явно указать типы, с которыми будет идти работа. Модель явного воплощения - средство языка, а не больное мое воображение smile Правда у Вандевурда сразу оговорено, что это не всегда очень удобно и вообще лучше этого не делать, но иногда выход smile


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 12.4.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(vinter @  12.4.2007,  19:09 Найти цитируемый пост)
а обьясни пожалуйста зачем при таком подходе, вообще шаблон нужен?

ну писанину сокращает в любом случае.
PM MAIL WWW   Вверх
chipset
Дата 13.4.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Шаблоны вообще лучше применять только в разработке библиотек и программ для активного повторного использования.
Сильный энтузиазм может привести к неразберихе smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Gunslinger
Дата 13.4.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Так в чем сейчас стоит загвоздка? Компиляторы не поддерживают (или плохо реализуют) или это уже дело вкуса и читабельности кода?
PM MAIL   Вверх
Daevaorn
Дата 13.4.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Экспорт компиляторы (за исключением одного) не поддерживают. точка.
PM MAIL WWW   Вверх
Goganchic
Дата 16.4.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще я и многие мои знакомые активно используют шаблоны....
А главная загводка вот в чем: чем конструкция больше упрощает и сокращает код - тем проще в ней ошибиться.
PM Jabber   Вверх
Earnest
Дата 17.4.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Это как спроектируешь... smile 
Возьми хотя бы бустовские шаблоны. Там компилируется == почти наверняка работает.


--------------------
...
PM   Вверх
JackYF
Дата 17.4.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Earnest @  17.4.2007,  19:02 Найти цитируемый пост)
Там компилируется

 smile вот... если пример средненавороченный, то там сложность добиться эффекта компиляция сравнима с отладкой нешаблонного неработающего кода smile

Но уж если скомпилировалось smile

А особенно любят бустовский код компиляторы. Допустишь маленькую ошибку... - и компилятор радостно выльет столько compile-error' ов... smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 17.4.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(JackYF @  17.4.2007,  20:11 Найти цитируемый пост)
то там сложность добиться эффекта компиляция сравнима с отладкой нешаблонного неработающего кода 

Ну это ты брось... код не работать может по-разному. А с шаблонами - на самом деле дело привычки. Если долго не используешь, то да, с первого раза правильно написать не всегда получается.

Цитата(JackYF @  17.4.2007,  20:11 Найти цитируемый пост)
А особенно любят бустовский код компиляторы. Допустишь маленькую ошибку... - и компилятор радостно выльет столько compile-error' ов... 

Зато знаешь как интуиция развивается  smile 




--------------------
...
PM   Вверх
JackYF
Дата 17.4.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Earnest @  17.4.2007,  19:36 Найти цитируемый пост)
Зато знаешь как интуиция развивается  smile 


О да. После экспериментов с boost::lambda и boost::bind   smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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