Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизОбъясните пожалуйста дельфисту, что такое шаблоны в Си? Найти похожие ветки
← →
Циркуль (2007-11-01 01:57) [0]И что надо отвечать на нападки агрессивных сишников?
← →
umbra © (2007-11-01 01:59) [1]отвечать надо одним словом - "отстой" :)
← →
Германн © (2007-11-01 02:08) [2]
> И что надо отвечать на нападки агрессивных сишников?
Отвечать надо "Вас здесь не стояло". Ну или по Паниковскому с Балагановым - "А ты кто такой?" с толчком в грудь :)
← →
Ega23 © (2007-11-01 09:08) [3]Изучить Си, понять, в чём он хуже, а в чём лучше того же Delphi, и потом филосовски пожимать плечами и говорить: профессионалу всё равно на чём писать.
← →
Думкин © (2007-11-01 09:13) [4]> профессионалу всё равно на чём писать.
Это не так немного. :)
← →
wendy parkinson (2007-11-01 09:21) [5]>И что надо отвечать на нападки агрессивных сишников?
"О, милостливый государь, я раскаиваюсь в том, что был привержен все эти годы
упадочническому культу Дельфи. Я вижу мощь C++ и, находясь в здравом уме и твердой памяти, признаю, что программист познавший C++ никогда больше не возьмется за Дельфи. Преклоняюсь пред вами и падаю ниц, да хранит вас Господь."
← →
Однокамушкин (2007-11-01 09:32) [6]Начнём с того, что в С шаблонов вообще нет, они есть в С++
Шаблоны - это такие классы и функции, в которых типы (параметров, полей и т.п.) сами являются параметрами, и потом можно порождать конкретные классы и функции, подставляя конкретные типы в качестве этих параметров... Очень удобно для реализации алгоритмов, которые применимы к различным типам данных - например, с помощью шаблонов можно написать один раз алгоритм сортировки массива элементов, тип которых задан параметром, и он будет применим ко всем типам, для которых определены операции > и <
Шаблоны считаются устаревшим небезопасным средством, в новых языках вместо них принято делать обобщения (generics), которые по сути то же самое, но менее гибкие и потому более безопасные... В Delphi обобщения тоже давно обещают, по крайней мере, в .NET 2 - версии, потому что там они средой поддерживаются
← →
Anatoly Podgoretsky © (2007-11-01 09:35) [7]> Ega23 (01.11.2007 09:08:03) [3]
> говорить: профессионалу всё равно на чём писать.
А раз все равно, то писать будет на одном языке.
← →
guav © (2007-11-01 09:36) [8]http://yosefk.com/c++fqa/templates.html
← →
wendy parkinson (2007-11-01 09:49) [9]Однокамушкин (01.11.07 09:32) [6]
> Шаблоны считаются устаревшим небезопасным средством, в новых
> языках вместо них принято делать обобщения (generics), которые
> по сути то же самое, но менее гибкие и потому более безопасные.
> ..
Да, но эти самые устаревшие и небезопасные шаблоны, которые по сути являются макросами, позволяют осуществлять метапрограммирование посредством себя
http://www.codeproject.com/cpp/crc_meta.asp
чего генерики делать не позволяют, так как макросами не являются.
← →
DrPass © (2007-11-01 11:18) [10]
> Да, но эти самые устаревшие и небезопасные шаблоны, которые
> по сути являются макросами, позволяют осуществлять метапрограммирование
> посредством себя
А зачем в коде, предназначенном для чтения и дальнейшей поддержки живыми людьми, делать "метапрограммирование посредством шаблонов"?
← →
wendy parkinson (2007-11-01 11:23) [11]DrPass © (01.11.07 11:18) [10]
Статью читали?A while ago I was working on a program that used a large lookup table to do some computations. The contents of the table depended on a large number of parameters that I had to tweak to get optimal performance from my code. And every time I changed one parameter the whole table had to be recalculated...
I had written a function that dumped the content of the table to standard output. That way I could compile my program with the new parameters set, cut-and-paste the table from screen and into my source code and finally recompile the whole project. I didn"t mind doing that - the first twenty times. After that I figured there had to be a better way. There was. Enter Template Metaprogramming.
← →
Игорь Шевченко © (2007-11-01 11:26) [12]А в C нету шаблонов
← →
DrPass © (2007-11-01 11:35) [13]
> wendy parkinson (01.11.07 11:23) [11]
> DrPass © (01.11.07 11:18) [10]
>
> Статью читали?
Ага. Согласись, что ЭТОtemplate< int i >
class LOOP{
public:
static inline void EXEC(){
cout << "A-" << i << " ";
LOOP< i-1 >::EXEC();
cout << "B-" << i << " ";
}
};
class LOOP< 0 >{
public:
static inline void EXEC(){
cout << "A-" << i;
cout << "\n";
cout << "B-" << i;
}
};
...не имеет права быть в программе вместо этогоint sum = 0;
for (int i = 1 ; i <= 1000; i++)
sum += i;
Пусть даже и разворачивается в более быстрый линейный код (хотя неизвестно, что лучше - три ассемблерные инструкции цикла или тысяча линейных инкрементов).
← →
wendy parkinson (2007-11-01 11:48) [14]DrPass © (01.11.07 11:35) [13]
Программы вообще не нужны. А программирование суть зло.
← →
DrPass © (2007-11-01 12:44) [15]
> wendy parkinson (01.11.07 11:48) [14]
Да, а С++ные программисты пьют кровь убиенных христианских младенцев
← →
clickmaker © (2007-11-01 12:49) [16]
> что надо отвечать на нападки агрессивных сишников?
хук в бубен
← →
wicked © (2007-11-01 12:55) [17]> DrPass © (01.11.07 11:35) [13]
имеет, поскольку развернется не в линейные инструкции, а в одну константу
вообще, суть метапрограммирования с темплатами - порождать необходимый код на стадии компиляции, а также вынести константные вычисления из стадии выполнения в стадию компиляции
← →
Mystic © (2007-11-01 12:57) [18]Говорить, что аналог шаблонов есть в Ada ;)
← →
DiamondShark © (2007-11-01 12:58) [19]
> Объясните пожалуйста дельфисту, что такое шаблоны в Си?
Седло для коровы.
> И что надо отвечать на нападки агрессивных сишников?
Посылать далеко и нецензурно.
← →
Alkid © (2007-11-01 13:28) [20]
> Шаблоны считаются устаревшим небезопасным средством, в новых
> языках вместо них принято делать обобщения (generics), которые
> по сути то же самое, но менее гибкие и потому более безопасные.
> .. В Delphi обобщения тоже давно обещают, по крайней мере,
> в .NET 2 - версии, потому что там они средой поддерживаются
Это чем же шалоны небезопасны? Очень интересно, жду ответа.
Вообще же, дженерики - это весьма размытый термин, ибо они есть и в Java и в .NET 2, но имеют разную природу. В Java это чисто compile-time вещь, по сути аналогичная шаблонам в С++, а в .NET 2 это Run-Time механизм, поддержаный в платформе.
Кстати, небольшой нюанс: под .NET 2 можно писать используюя и шаблоны и дженерики. Это можно сделать при помощи MC++ и С++/CLI.
В Дельфи шаблонов сильно не хватает. Там хотя бы дженерики сильно бы пригодились.
Что касается метапрограммирования на шаблонах, то как некий state-of-art программисткого умения и концепт, показывающий безграничность нашей мысли, это очень хорошо, а в промышленной практике - это плохо. По сути это есть попытка нецелевым способом использовать шаблоны для того, что бы моделировать такие стредства, как макросы (не Сишные, а в стиле LISP и Nemerle) и "нормальное" метапрограммирование.
Как и все попытки моделировать на уровне библиотечного кода те вещи, которые должны быть поддержаны на уровне языка или платформы (такие как Reflection, автоматическая сборка мусора, метапрограммирование и т.п.) этот подход имеет кучу минусов: нечитаемый переусложнённый код, в котором легко сделать ошибку, который серъёзно повышает требования к подготовке программиста. Кроме того, код становится более требователен к качеству реализации стандарта компилятором и дольше собирается.
В С++ скорось сборки это вообще проблема. У нас на работе и без особого метапрограммирования один модуль может собираться по 1.5-2 часа. А всё из-за одного перца, который реализовал парочку своих state-of-art идей.
Это я к тому, что шаблоны - это один из инструментов, который предоставляется С++, но имеет свою область применения. Отсутствие шаблонов не делает остальные языки однозначно хуже С++.
← →
clickmaker © (2007-11-01 13:30) [21]
> Это чем же шалоны небезопасны?
это маркетинг
если невыгодно продавать соль, то ее обзывают "белой смертью", ну и т.д.
← →
Alkid © (2007-11-01 13:35) [22]
> это маркетинг
> если невыгодно продавать соль, то ее обзывают "белой смертью",
> ну и т.д.
Точнее, если хочется впарить что-то, что должно вытеснить соль с рынка :)
← →
wendy parkinson (2007-11-01 13:38) [23]Alkid © (01.11.07 13:28) [20]
> Это я к тому, что шаблоны - это один из инструментов, который
> предоставляется С++, но имеет свою область применения. Отсутствие
> шаблонов не делает остальные языки однозначно хуже С++.
Но делает C++ однозначно лучше среди языков своего класса.
← →
homm © (2007-11-01 13:43) [24]> Объясните пожалуйста дельфисту, что такое шаблоны в Си?
В Си нет шаблонов, afaik.
← →
Alkid © (2007-11-01 13:46) [25]
> Но делает C++ однозначно лучше среди языков своего класса.
А какие ещё языки входят в этот класс?
Это я к тому, что достоинства языка складываются из многих его свойств, а не только из начилия/отсутствия шаблонов :)
← →
DiamondShark © (2007-11-01 13:51) [26]
> В Дельфи шаблонов сильно не хватает.
О, да. Дельфист без шаблонов -- всё равно что рыба без велосипеда.
← →
Alkid © (2007-11-01 13:58) [27]
> О, да. Дельфист без шаблонов -- всё равно что рыба без велосипеда.
Сарказм не по делу. Основное назначение шаблонов - создание типобезопасноых контейнеров.
Сейчас, если у меня есть класс TMyClass, и я хочу сделать для него контейнер, то у меня есть 2 пути:
1. Использовть TObjectList и каждый раз заниматься небезопасными конверсиями типов.
2. Писать самому свой контейнер.
Первый путь небезопасен, второй связан с постоянным рутинным написанием почти одинакового кода.
Шаблоны предоставляют более оптимальный путь. Без них прожить можно, я не спорю, но с ними можно сэкономить много времени и избежать ошибок.
← →
clickmaker © (2007-11-01 13:59) [28]
> если хочется впарить что-то, что должно вытеснить соль с
> рынка
да
в умелых руках, как известно, и топор - балалайка
а тому, у кого руки под х.. заточены, тому никакие шаблоны не помогут )
← →
vpbar © (2007-11-01 14:05) [29]Alkid © (01.11.07 13:58) [27]
Для таких случаев можно симулировать :)
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=744 и ww.delphikingdom.com/asp/viewitem.asp?catalogid=453 есть статья получше. Но ссылку не помню.
← →
DiamondShark © (2007-11-01 14:07) [30]Я знал, что мне опять расскажут байку про контейнеры.
← →
Alkid © (2007-11-01 14:18) [31]
> Я знал, что мне опять расскажут байку про контейнеры.
Я примерно 5 лет программировал на дельфи на прошлой работе. За это время я бессчётное количество раз реализовывал разного рода контейнеры, пока не открыл способ, описанный в [29]. На этом я потерял столько времени и наделал столько ошибок, переписывая в n+1-ый раз методы GetCount, GetItem, Add, Remove и Clear, что могу тебе авторитетно заявить - про контейнеры, это не байки, а суровая правда жизни.
> vpbar © (01.11.07 14:05) [29]
Да, я этот медод знаю и использовал. :)
← →
Palladin © (2007-11-01 14:23) [32]
> Но делает C++ однозначно лучше среди языков своего класса.
а что за класс языков то?
← →
wendy parkinson (2007-11-01 14:31) [33]Palladin © (01.11.07 14:23) [32]
>а что за класс языков то?\
general purpose strongly typed languages
← →
DiamondShark © (2007-11-01 14:35) [34]
> Alkid © (01.11.07 14:18) [31]
Я примерно 12 лет программировал на дельфи, не помню, сколько раз я реализовывал разного рода контейнеры. Наверное, потому не помню, что это не было не только сколь-нибудь трудным делом, но и сколь-нибудь значимым, по сравнению со всем остальным делом.
Зато я прекрасно помню проект на позапрошлой работе, который мне достался в наследство от предыдущего сотрудника -- весьма креативного юноши, у которого ещё не прошёл ребячий восторг от возможности написатьvector<CMyObject>
. Проект долго переходил из рук в руки, вызывая рак мозгов у всех, пытавшихся разобраться в нагромождении шаблонов юного вундеркинда.
После этого я повесил в красном углу икону преподобного Вирта и возжёг пред ней лампаду.
← →
Alkid © (2007-11-01 14:44) [35]
> Я примерно 12 лет программировал на дельфи, не помню, сколько
> раз я реализовывал разного рода контейнеры. Наверное, потому
> не помню, что это не было не только сколь-нибудь трудным
> делом, но и сколь-нибудь значимым, по сравнению со всем
> остальным делом.
По сравнению с остальным делом - не трудное. Но это примерно как заворачивать винты отвёрткой, когда есть электический шуруповёрт. Можно, но удобнее с шуруповёртом.
Что касается креативного юноши - я уже сказал, что шаблонами надо уметь пользоваться, и как и любое языковое средство их можно употребить во вред. Неумелое (или же "креативное") пользование указателями и динамическим распределением памяти может превратить работу с программой в ад. Является ли это поводом отказаться от них? Я думаю, что нет.
Принципиальны отказ от шаблонов тут так же излишне категоричен, как и их "креативное" использование в стиле boost.
← →
wendy parkinson (2007-11-01 14:44) [36]DiamondShark © (01.11.07 14:35) [34]
А от такого бы на месте застрелился?
vector<shared_ptr<map<string, stirng> > >
← →
Alkid © (2007-11-01 14:46) [37]
> general purpose strongly typed languages
Очень широкий класс языков получается.
В любом случае, если свободно выбирать из них на чём стартовать новый проект, то у меня выбор будет скорее всего в пользу C#, а не С++, хоть дженерики С# мне нравятся меньше, чем шаблоны в С++. А всё потому, что у С++ есть куча других недостатков, которые не компенсируются наличием шаблонов.
← →
clickmaker © (2007-11-01 14:46) [38]
> Принципиальны отказ от шаблонов тут так же излишне категоричен,
> как и их "креативное" использование в стиле boost.
короче, любая ветка в стиле "холивор" сводится к тому, что "любой овощ должен быть употреблен в надлежащее время..." или как там говорил незабвенный Козьма Прутков...
:)
← →
wendy parkinson (2007-11-01 14:47) [39]Alkid © (01.11.07 14:46) [37]
Но у C# тоже есть один большой недостаток. 20 мегабайтный :)
← →
homm © (2007-11-01 14:48) [40]> [39] wendy parkinson (01.11.07 14:47)
> Но у C# тоже есть один большой недостаток. 20 мегабайтный :)
В версии 3.0 уже 35 вроде. И все больше и больше…
Страницы: 1 2 3 4 5 вся ветка
Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.045 c