![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Всем привет.
Вот любопытно, кто и как, переписал бы этот код с использованием boost::bind() вместо pred().
http://liveworkspace.org/code/76204a07cf59...f3302ba715bf863 т.е. интересует именно способ избавления от pred(). _pred1() и _pred2() допустим библиотечные функции. Это сообщение отредактировал(а) boostcoder - 18.12.2010, 19:44 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
напрашивается что-то типа:
но это не правильно.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
logical_and забыто.. Добавлено через 1 минуту и 53 секунды
http://liveworkspace.org/code/d50c1e6bda8e...b306d3cb645eda0 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага. а я полез в boost.lambda искать способ спасибо огромное Добавлено через 8 минут и 41 секунду но вопрос еще не закрыт. интересует следующее. можно ли как-то создать шаблон, который сможет в качестве параметров принимать функторы, и дополнительным параметром принимать logical_*. есть идеи? что-то типа:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
лямбда тоже поможет пож Это сообщение отредактировал(а) mes - 18.12.2010, 20:51 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
boostcoder, я так понимаю, ты сейчас бустом увлечен по самые уши. Но имей в виду следующее. Когда в коде видишь трехэтажный байнд, хочется найти автора и кое-что ему оторвать ... (руки, если что).
In real life полезны только простые байнды, которые читаются на раз, без лишнего напряжения извилин, которые обычно заняты чем-нибудь еще. Поддерживать зашифрованный переизбытком буста код очень тяжело. Я тоже сначала этим делом увлекалась, каждый цикл с итераторами норовила алгоритмом заменить, ну и в таком духе. Прошло, после возвратов к коду годичной давности. Забайндить можно многое, но далеко не все следует делать. Так что знай меру и будь проще. Это, конечно, не только к бусту относится. -------------------- ... |
|||
|
||||
| boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
согласен, если в коде увидеть такое:
но а если так?:
разве не очевидней и понятней?
так и делаю. не люблю циклы в коде. что в этом плохого? понятней ведь использование copy_if() и подобных, чем, к примеру, цикл с if`ами ну а for или while без if`ов, т.е. просто для копирования, вообще нелепо смотрится. разве нет? Добавлено через 4 минуты и 16 секунд не понял.. это намек на что-то личное? Это сообщение отредактировал(а) boostcoder - 20.12.2010, 20:06 |
||||||||
|
|||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
boostcoder, в чём-то согласен с Earnest ( кроме
. это, наверное, действительно что-то личное тебе часто приходилось поддерживать/изменять чужой код ? если в нём всё натыкано предикатами, функторами и т.п., и если там всё работает так как надо, то выглядит это оч.хор., но если нужно что-то изменить - обычный цикл ( for или while ) - гораздо проще. в сопровождении, конечно, а не просто в чтении/понимании кода Это сообщение отредактировал(а) borisbn - 20.12.2010, 20:55 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
функтор ещё нужно найти в чужом коде (хотя... с томатоАссистентом - но проблем), и к тому же, возможно, при изменении этого функтора заденутся другие места программы, а тебе нужно поменять только в этом месте... Ладно. IMHO этот холивор такой же бессмысленный и беспощадный, как far vs Total или Ctrl+C vs Ctrl+Ins :
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тогда уж если делать, то, имхо, чтоб было хотя бы так : std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2) , my_bind ( logical_and, _pred1, _pred2 ) ); считаем что лямбды нам запретили.. Это сообщение отредактировал(а) mes - 20.12.2010, 21:16 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
нет. я в этом вижу гибкость проектирования. при использовании цикла, тебе нужно чтоб он имел в распоряжении все переменные/объекты которыми оперирует. это монолит. нужно следить за точками входа/выхода. а при использовании предикатов, ты отвязываешься от локального кода в котором предикат используется. всю необходимую информацию о точках входа/выхода нет надобности держать в голове. получается своего рода изолированность от локального блока кода. всю информацию которая необходима предикату, ты передаешь ему в конструктор. Добавлено @ 21:18 слишком много деталей.. если у предиката имя типа "and_pred", и видно что он используется в std::copy_if(), то(по крайней мере мне) становится понятно его внутренее устройство. Добавлено через 5 минут и 43 секунды пока - да Это сообщение отредактировал(а) boostcoder - 20.12.2010, 21:20 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
согласен.. частично согласен.. не согласен с конструкцией.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
действительно, хорошо бы иметь шаблон предиката для стл, алгоритмов, разгружающий бинд..
только он должен быть простым предикатом, а не and_pred.. a боост::лямбду тоже запретили ? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в этой теме, мне действительно интересно реализация этого без лямбды. Добавлено через 1 минуту и 26 секунд что именно в "and_pred" не нравится? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
префикс "and" который заставляет изготавливать несколько однообразных предикатов.. сейчас попробую наваять как я себе представляю.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ааа.. так он появился из-за моей задачи а в идеале, да, должен еще и логический предикат указываться. хотя..группа предикатов and_*, or_* тоже бы облегчила понимание. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот грубый набросок: http://liveworkspace.org/code/d649be290aaa...b02824b4353dffa
чтоб выглядило прилично, нужно поднапрячься.. но неохота.. главное смысл понятен, как получать композиционный отложенный предикат.. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Почему сразу личное? Это я про программирование вообще. Не только бустом можно код зашифровать. И я вовсе не против алгоритмов и предикатов. Если код с алгоритмом-предикатом-байндом выглядит ясно, то здорово. Просто не надо это самоцелью делать. -------------------- ... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так нет же. цель - улучшить стиль. подглядывание стиля из буста, очень помогает. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А навеяно вот чем:
слишком много усилий тратится на то, чтобы придумать супер-шаблон, в который можно запихать 2 или больше предиката, да чтобы все это еще хорошо выглядело... Как академическая, задачка интересная, да. Но на практике... какой алгоритм (я имею в виду обработку каких-нибудь данных, практичную) за это время можно было бы написать... Короче, время на заточку лопаты нужно разумно регулировать. Туда ведь не только время, но и мозговая энергия уходит... Работодатель тебе за что платит-то? Ведь не за байндеры хитрые? -------------------- ... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
шаблон пишется один раз. вставляется в какой-нибудь utils.hpp, и используется во всем проекте. нет, конечно, если в задаче использование этого шаблона происходит все раз - то разрабатывать его нет смысла. но после того, как он уже разработан, скопипастить его много времени не занимает. Это сообщение отредактировал(а) boostcoder - 21.12.2010, 11:21 |
|||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
немного с опозданием, но пускай останется для истории
бустовский bind поддерживает логические операции, что позволяет избавиться от одного уровня с logical_and
вместо
можно короче
Это сообщение отредактировал(а) null56 - 10.1.2011, 01:38 |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это я знал, т.к. регулярно использую operator!() с баиндами. но мне и в голову не пришло что можно таким образом комбинировать функциональные объекты... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |