Здравствуйте, Erop, Вы писали:
E>Общий смысл такой, что править шаблоны обычно дико дорого, поэтому их можно использовать либо в виде каких-то библиотечных очень хорошо отлаженных примитивов, скажем контейнеров. Либо в каких-то герметичных участках кода, где от чего-то надо несколько раз сдублировать код. Но только второе надо делать уже очень с опаской. Опять же про переиспользование таких шаблонов лучше всего забыть как правило сразу
Согласен, в некоторых местах явные интерфейсы более предпочтительны, а шаблоны неумесны.
R>>Зато и возможностей больше. Гораздо больше. Причём принципиально новых. Вспомни хотя бы std::vector<>! Как ты его предлагаешь реализовывать без шаблонов? Или ты его не используешь?
E>Конечно я не возражаю, против шаблонного массива. Но std::vector те не менее не использую. У нас в конторе есть своя, более древняя библиотечка, которая конечно хуже STL, но предсказуемее. Например там более очевидны временные сложности операуий
Ну я надеюсь, что он хотя бы типобезопасный, а не на void* работает

И ещё надеюсь, что мне, что бы захранить в таком контейнере какой-то класс, не надо вначале реализовывать интерфейс IStorable
E>
E>>>2) Намного более сложный синтаксис и семантика. Вот, например, что тут написано:
E>>>E>>>template<typename TLog>
E>>>class Base {
E>>>protected
E>>> void exit( int );
E>>>};
E>>>template<typename TLog>
E>>>class MyExitProicessor : public Base<TLog> {
E>>>public:
E>>> void OnExit( TLog& log, int code )
E>>> {
E>>> LogExit( log, code ); // это какой-то метод MyExitProicessor, описанный ниже
E>>> exit( code );
E>>> }
E>>>};
E>>>
R>>Имхо. Всё понятно. Кстати, лучше писать "this->LogExit()" и "this->exit()", тогда и понятнее будет.
E>Может и лучше, но значит будет другое.
Вообще-то в выделенной строке зовут функцию сишную exit
.
А вот ещё кусок кода:
int* p = 0;
*p = 0;
И без шаблонов. Вывод какой: ламеров надо либо обучать, либо увольнять
E>
E>>>3) Очень неудобные сообщения об ошибках в пользовательском коде.
R>>В большинстве случаев точно такие же как и без шаблонов. Надо просто их внимательно прочитать, а не говорить сразу "ух ты #$%, я это даже читать не буду". Вот ещё здесь.
E>К несчастью мне приходится это читать регулярно.
Я так тебе скажу, что до изобретения STL я не встречал сообщений об ошибках, которые не помещаются в окно консоли
Меня лично это не пугает.
Я сообщения об ошибках на принтере не печатаю, и за место в консоли арендную плату не плачу
E>
E>>>А вот реальные преимущества всех этих трюков Александреску они в чём?
R>>Меньше дублирования. Лучше понятны намерения программиста. Аспекты лучше выделены, а не замешаны в один клубок. Но это всё достигается за счёт наличия более сложного (интеллектуального) кода.
R>>Я так считаю: можно иметь или много "тупого" кода (я его называю "raw"), это когда много накопипастеных функций, или меньше кода, но более "интеллектуального".
E>Прости, но мне кажется, что все преимущества, кроме "Лучше понятны намерения программиста" достигаются хорошим проектированием и реализацией кода задачи, а вовсе не применением головоломных конструкций из шаблонов
К сожалению, некоторые задачи и некоторые виды дублирования не подвласны в С++ никому кроме шаблонов. Ни явным интерфейсам, ни хорошему проектированию.
К ещё больщему сожалению, некоторые виды дублирования не подвласны даже шаблоным, а подвласны только макросам...
E>Что же касается намерений, то я согласен, что они понятны. Они обычно (явно или просто по факту) состоят в том, чтобы удорожить разарботку и сопровождение.
Те, что используют исключения, паттерны, готовые библиотеки да и вообще С++ по-твоему те же намерения имеют? Вообще надо на asm'е писать. Всё до примитивного просто и явно.