TR1 уже давно вышел. Это хорошо. Студия 2008 и 2010 уже включают его по умолчанию. Это просто отлично.
Стандарт (а TR1 – это де-факто уже стандарт) – это всегда хорошо. Больше нельзя называться C++ программистом и закатывать истерики при виде безобидного bind. Теперь нужно либо напрячь мозги и таки освоить основы функциональщины, либо идти заниматься гуевой мышевозней.
А еще стандарты – это плохо. Потому что любое, даже самое разумное и оправданное изменение стандарта превращается в процесс перемещения и горы и Магомета к единому стандартизированному месту встречи. И стандартно занимает до чертиков времени, да и других восполнимых и не очень ресурсов тоже дофига требует.
Вот включили они bind в стандарт. И чо (что, шо, So what, нужное подчеркнуть)? А перегруженные операторы не включили! Бо не было их еще в бусте на момент подачи черновиков в стандарт. В итоге в TR1 вот так вот не сделать:
vector<Person> myVector; // // Some stuff here // vector<Person>::iterator iter = find_if( myVector.begin(), myVector.end(), bind(&Person::GetLastName, _1) == "Pupkin");
А все из-за того, что тот bind, что в TR1, не перегружает оператор “==”, сцуко такой! В итоге, чтобы сделать то же самое, что на куске кода вверху, нужно городить двухуровневый bind с equal_to посередине, от вида которого даже у привычных к boost пассажиров может случится истерика:
vector<Person>::iterator iter = find_if( myVector.begin(), myVector.end(), bind(equal_to<string>, "Pupkin", bind(&Person::GetLastName, _1)));
Еще можно по-старинке взять и нарисовать функтор. На каждый подобный чих. В итоге от обилия их изжога начнется уже у меня.
Нинавижу.
А следующего стандарта еще 10 лет ждать.
Надо ждать lambda функции. gcc, кстати, уже вроде как умеет.
Так вроде и буст умеет. Но когда это еще будет?
http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions
Я про этих красавцев
Остается только ждать
Ну вообще-то gcc их давно поддерживает и судя по всему десятая студия тоже
А вот окончательной стандартизации мы можем и не дождаться, они как-то уже слишком долго этот стандарт родить пытаются.
С ламбдами у меня будет та же история. Ниасилившие будут трясти стандартом.
Эээ, ну ты им прозрачно намекни, что bind можно на свалку отправить, раз настоящие лямбды есть
В данный момент они не упускают случая потыкать трясущимися пальцами в многостраничный экран ошибок, появляющийся когда они пытаются сбиндить не сбиндиваемое.
если с лямбдами дело будет обстоять лучше, то перейдем на них аж бегом
А, да, Google Mock еще умеет делать
vector::iterator iter = find_if(
myVector.begin(),
myVector.end(),
Eq(Property(&Person::GetLastName), "Pupkin"));
Совсем не стандарт, зато выглядит неплохо (и можно вообще офигительные конструкции наворачивать, кстати, со сравнениями массивов например)
Хм. Красиво, но ИМХО не более читабельно, нежели моя страшная конструкция с equal_to. Вот бустовский оператор равенства смотрится органично.
Якие замечательные вещи делаютсо! Теперь я снова почти не знаю C++ и снова могу по этому поводу не париться.
А вообще говоря, что-то енти ваши плюсы чем дельше, тем всё больше мне напоминают Форт.
Это, между прочем, почти настоящее функциональной программирование!
А мне как-то пофиг в последнее время…
Почти не почти – не в том суть. Суть в том, что за всеми новомодными рюшечками теряется изначальная идея _ясного_ выражения мысли посредством языка программирования. Отовсюду только свистелки и перделки торчат.
Этим новомодным рюшечкам в обед сто лет. Да и программа в функциональном стиле, как правило, читается гораздо легче.
Я тут по долгу службы разбираюсь с фреймворком, написанным в процедурном стиле на чистом си. Выражение мысли на уровне “пишем число А в переменную Б” – яснее не бывает.
Правда, разобраться в dataflow решительно невозможно.
Свистелки и перделки – это скорее новомодные управляемые среды.
Дык вот и получается, как обычно, что всё зависит от наличия мозгов у программиста. “Крутые профессионалы”, начитавшись какого-нибудь там Александерску, но не могущие ответить нафига это всё нужно кроме как цитированием книги и “это круто профессионально” – часто творят примерно такую же байду, как этот твой код на Сях. С другой стороны, человек, который понимает что и зачем он делает и на чистом Си напишет так, что пользоваться потом просто и приятно.
Я вообще в последнее время думаю, что подход со смесью ядра и низкоуровневых компонентов на Сях и склеивание их между собой и гуишной мордой на чём-нибудь типа там Питона – оно часто предпочтительнее, чем от и до использовать плюсы. Ибо получается, что каждый инструмент используется для того, под что заточен.
kr00той профессионал – это тот, кто пишет сопровождаемый и поддерживаемый код. Это может быть что угодно – от ассемблера до ужасного на первый взгляд нагромождения шаблонов. Но это сложно, бо нужно иметь голову на плечах.
Кстати, си может быть и хорош в определенных вещах, но рисовать поддерживаемые и, главное, расширяемые вещи на нем практически невозможно. Все это обычно выражается либо в копипасте, либо в симуляции наследования и таблиц виртуальных функций, либо просто в макаронной фабрике.
У С++ по сравнению с си сейчас есть только один недостаток – отсутствие бинарной совместимости.
“тот, кто пишет сопровождаемый и поддерживаемый код” – это просто профессионал. А “kr00той профессионал” – тот кто больше понты кидает. Правда, некоторые из них ещё и какой-то рабочий код дают – врать не буду.
За чистый Си тоже агитировать не буду – это другая крайность.
Имхо, всё-таки, каждому инструменту – своё место. Если ты вместо SCADA захочешь заюзать что-то своё там, где вообще-то нужна именно SCADA-система, то какой бы глючной не была альтернатива – вменяемый заказчик тебя пошлёт…
Ой, таким заказчегам, пихающих невесть что туда, где нормальная SCADA нужна, числа нет.
Я же сказал – “вменяемый”.
Про “сделай из говна и палок” я тоже много историй знаю.