Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, nen777w, Вы писали:
N>>но хочется разобраться со всеми этими if_then_else, switch_statment и т.п.
J>Тебе горит или просто интересуешься? Если просто — то дождись выхода третьего феникса: там будет все то же самое, но по-человечески сделанное.
нет не горит, просто интересуюсь, решил за 3-м заходом таки взять MPL
Здравствуйте, nen777w, Вы писали:
N>нет не горит, просто интересуюсь, решил за 3-м заходом таки взять MPL
давно пора
N>А что такое феникс?
феникс — это лямбда из спирита.
третья версия будет целиком на Boost.Proto и будет самостоятельной библиотекой (а не в составе спирита), в идеале заменящей и Boost.Bind, и Boost.Lambda.
On 07.05.2011 19:20, nen777w wrote:
> сам себе и отвечу посидел ещё раз над докой. оказывается всё достаточно просто: > > std::sort( v.begin(), v.end(), > ( bl::var(arr)[(&bl::_1 ->*&S::index)]< bl::var(arr)[(&bl::_2 ->*&S::index)] ) > );
Это по-твоему просто ?
Это по-твоему естественно ?
Здравствуйте, MasterZiv, Вы писали:
MZ>On 07.05.2011 19:20, nen777w wrote:
>> сам себе и отвечу посидел ещё раз над докой. оказывается всё достаточно просто: >> >> std::sort( v.begin(), v.end(), >> ( bl::var(arr)[(&bl::_1 ->*&S::index)]< bl::var(arr)[(&bl::_2 ->*&S::index)] ) >> );
MZ>Это по-твоему просто ? MZ>Это по-твоему естественно ?
MZ>По-моему так уродство.
это уже философский вопрос. на самом деле если не понимать синтаксис то выглядит конечно страшновато, но если немного почитать доку всё становится понятно.
Модераторам:
Сори за эти посты, просто как говорят — если хочешь запомнить поделись ещё с кем нибудь.
Я кидаю это потому как поиск здесь по boost::lambda дал ну очень мало и не сильно отличающееся от стандартной документации.
Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.
Хотелось бы уйти от повторения: bl::var(axis_y)[bl::var(n)]
т.е. так: bl::_1 = bl::var(axis_x)[bl::var(n)]
по документации Я так понимаю это можно сделать и это работает для std::for_each() например, но для bl::for_loop() — это не работает:
error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const boost::tuples::null_type'
пока не пойму почему, похоже нужно копать по исходникам в глубь библиотеки.
Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...
Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?
N>>Офигительная штука!! Ух.
I>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...
На самом деле почитав документацию всё становится достаточно понятно, так что страшных закорючек бояться не стоит. Люди вот например как то же пишут на Perl-е а там синтаксис по круче будет.
I>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?
Мне просто интересно разобраться было. Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.
lambda — это способ объявить функциональный объект, т.е. объект ведущий себя как функция.
Пока Я вижу в этом их применение, но теперь наверняка со временем применяя её в той или иной ситуации можно будет постепенно расширить и способы её использования.
Может те кто давно в теме ещё что то подскажут.
nen777w:
I>>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях... N>На самом деле почитав документацию всё становится достаточно понятно
Вот только понять, что делает нормальный читабельный код, можно гораздо быстрее. С поиском ошибки — если таковая возникла — аналогично.
I>>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло? N>Мне просто интересно разобраться было.
Вот-вот, из академического интереса побаловаться можно, но чтобы использовать на практике — ну на фиг такое счастье.
N>Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, nen777w, Вы писали:
N>>lambda рулит!!!
N>>Офигительная штука!! Ух.
NB>ты эту офигительную штуку на производительность не тестировал?
а зачем? В документации по boost::lambda и так видно что существует небольшое падение производительнсти по сравнению с самописными функторами.
Но мне это не критично, когда допишу полный алгоритм тогда и потестирую.
Здравствуйте, nen777w, Вы писали:
N>>>lambda рулит!!!
N>>>Офигительная штука!! Ух.
NB>>ты эту офигительную штуку на производительность не тестировал? N>а зачем? В документации по boost::lambda и так видно что существует небольшое падение производительнсти по сравнению с самописными функторами.
цифры в доках не смотри, они не обновлялась хз сколько лет.
N>Но мне это не критично, когда допишу полный алгоритм тогда и потестирую.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, nen777w, Вы писали:
N>>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то. __>+1 __>А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть
А это не для начальства. Это для себя.
А то что на работе... еле с 6-ки (сколько на мозги капал) переползли на 2008-ю... и то немецкую версию подсунули
Здравствуйте, Masterkent, Вы писали:
M>nen777w:
I>>>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях... N>>На самом деле почитав документацию всё становится достаточно понятно
M>Вот только понять, что делает нормальный читабельный код, можно гораздо быстрее. С поиском ошибки — если таковая возникла — аналогично.
I>>>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло? N>>Мне просто интересно разобраться было.
M>Вот-вот, из академического интереса побаловаться можно, но чтобы использовать на практике — ну на фиг такое счастье.
N>>Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.
M>Большое достижение, однако...
единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе.
Можно вместо
std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 ))
писать
std::find_if(... , ... , boost::lambda::_1 == 100500 )
ну и т.п.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Мой совет — не используйте boost::lambda. Это будет сыпать непонятными сообщениями в случае какой-то ошибки и очень долго компилироваться.
Сообщение об ошибках действительно не совсем что бы читаемы. Но всегда можно выделить кусок в котором происходит ошибка и постараться понять почему она происходит.
Потом с опытом ошибок становится намного меньше а со временем исчезают совсем.
KK>Ну и естественно это будет нечитаемо и не неотлаживаемо.
Да нормально всё с этой lambda. Ну да синтаксис сложноват. Но если вникнуть то не так и сложно на самом деле.
Я вокруг неё достаточно долго ходил, синтаксис очень отпугивал, больше предпочитал boost::bind.
Потом вдруг захотелось разобраться, один выходной и все стало значительно понятней.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, nen777w, Вы писали:
N>>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то. __>+1
__>А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть
Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.
On 09.05.2011 20:37, nen777w wrote:
> На самом деле почитав документацию всё становится достаточно понятно, так что > страшных закорючек бояться не стоит. Люди вот например как то же пишут на Perl-е > а там синтаксис по круче будет.
Пишут, запускают, работает, что надо исправить -- пишут снова с нуля,
потому как разобраться уже невозможно. Ты тоже так хочешь ?
Здравствуйте, s.ts, Вы писали:
ST>единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе. ST>Можно вместо ST>std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 )) ST> писать ST>std::find_if(... , ... , boost::lambda::_1 == 100500 ) ST>ну и т.п.
Здравствуйте, jazzer, Вы писали:
J>Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.
IMHO лучше типы прописывать, чем извращаться с boost::lambda
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, jazzer, Вы писали:
J>>Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.
AD>IMHO лучше типы прописывать, чем извращаться с boost::lambda
хмм...
что читабельнее:
std::sort( v.begin(), v.end(), _1 < _2 );
или
std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { a < b; } );
Или это ты первое называешь извращениями? Имхо, извращение — как раз второе.
И очень жаль, что комитет не смог родить в срок полиморфные лябмды (хоть они, естественно, не спорят с тем, что они нужны).
Еще пример:
auto f = _1 += _2;
int ia, ib;
std::string sa, sb;
f( ia, ib );
f( sa, sb );
сможешь повторить на лябмдах C++0x?
а ведь лябмды именно такого типа нужны для работы с гетерогенными контейнерами типа boost::fusion::vector.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, s.ts, Вы писали:
ST>>единственный профит, что я заметил по сравнению с boost::bind — там placeholers ведут себя иначе. ST>>Можно вместо ST>>std::find_if(... , ... , boost::bind( ...equal?, _1, 100500 )) ST>> писать ST>>std::find_if(... , ... , boost::lambda::_1 == 100500 ) ST>>ну и т.п.
AD>Нет, это неверно. boost::bind также поддерживает простые операторы сравнения и логические операторы: http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html#operators
Нет, это верно
Разница в поведении placeholders.
В boost::bind простые операторы не определены для placeholders.
Т.е. нельзя написать _1 == 1, но можно писать что-то типа boost::bind(&C::f, _1) == _2
А в лямбде именно для placeholders определены элементарные операторы.
Вот минимальный код:
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <vector>
#include <algorithm>
void f() {
std::vector<int> v;
std::find_if(v.begin(), v.end(), boost::lambda::_1 == 3 ); // тут все Ok
std::find_if(v.begin(), v.end(), _1 == 3 ); // тут ошибка компиляции error: no match for ‘operator==’ in ‘<unnamed>::_1 == 3’
}
Здравствуйте, jazzer, Вы писали:
J>что читабельнее: J>
J>std::sort( v.begin(), v.end(), _1 < _2 );
J>
J>или J>
J>std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { a < b; } );
J>
J>Или это ты первое называешь извращениями? Имхо, извращение — как раз второе. J>И очень жаль, что комитет не смог родить в срок полиморфные лябмды (хоть они, естественно, не спорят с тем, что они нужны).
Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, jazzer, Вы писали:
J>>что читабельнее: J>>
J>>std::sort( v.begin(), v.end(), _1 < _2 );
J>>
J>>или J>>
J>>std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b ) { return a < b; } );
J>>
J>>Или это ты первое называешь извращениями? Имхо, извращение — как раз второе. J>>И очень жаль, что комитет не смог родить в срок полиморфные лябмды (хоть они, естественно, не спорят с тем, что они нужны).
AD>Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.
Он и является выигрышным. Нужны полиморфные лямбды, встроенные в язык, тогда все будет супер.
И тот же пример будет выглядеть так (как вариант):
std::sort( v.begin(), v.end(), []( auto a, auto b ) { return a < b; } );
можно и другие варианты придумать:
std::sort( v.begin(), v.end(), [auto T]( T a, T b ) { return a < b; } );
Потом драконовское ограничение на выведение возвращаемого типа тоже мне не совсем понятно
Т.е. в примере выше он выведется, а в чуть переделанном — уже нет, потому что тело не записано в форме return expression:
std::sort( v.begin(), v.end(), []( Vector::const_reference a, Vector::const_reference b )
{ bool ret = a < b; return ret; } );
Зачем такое ограничение — хз.
В общем, не о чем спорить, имхо. Фича в С++0х отсутствует, и все это признают, в самом предложении написано, что эти лямбды — monomorphic, и есть соображения о создании полиморфных лямбд, которые как-то (не помню уже, как) конфликтовали c концептами (которые не вошли все равно).
Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).
Здравствуйте, jazzer, Вы писали:
AD>>Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.
J>Он и является выигрышным. Нужны полиморфные лямбды, встроенные в язык, тогда все будет супер.
Вообще-то эти вещи друг-другу не мешают, неплохо бы и частичное применение как в первом варианте
(или лучше с поддержкой компилятора: _ < _) и нормальные лямбды.
Здравствуйте, jazzer, Вы писали:
J>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, jazzer, Вы писали:
J>>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).
__>Когда уже выйдет этот Boost.Phoenix ? Все ждем..
Да вроде планировали на след. неделе слепить boost 1.47.0, там он уже будет...
А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме
Proto рулит
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, jazzer, Вы писали:
J>>>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).
__>>Когда уже выйдет этот Boost.Phoenix ? Все ждем..
J>Да вроде планировали на след. неделе слепить boost 1.47.0, там он уже будет...
О как.
Ждем.
Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?
J>А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме J>Proto рулит
<offtop>Лучше бы уже С++ улучшили, чтобы не делать такие извращения.</offtop>
Здравствуйте, _nn_, Вы писали:
__>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?
Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.
J>>А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме J>>Proto рулит
__><offtop>Лучше бы уже С++ улучшили, чтобы не делать такие извращения.</offtop>
Ну чтоб улучшить С++ до такого уровня, чтоб Прото с Фениксом стал не нужен — это реолючия целая, сравнимая с концепцтами по масштабам.
Хотя я бы не отказался, конечно
__>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ? J>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.
ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать?
просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.
Здравствуйте, nen777w, Вы писали:
__>>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ? J>>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.
N>ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать? N>просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.
Не понял вопроса, что с algorithm и functional?
Феникс предоставит функциональность как Boost.Lambda, так и Boost.Bind.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, nen777w, Вы писали:
__>>>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ? J>>>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.
N>>ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать? N>>просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.
J>Не понял вопроса, что с algorithm и functional? J>Феникс предоставит функциональность как Boost.Lambda, так и Boost.Bind.
А, понял. Спасибо.
Сейчас как раз по SVN затягиваю boost хочу посмотреть что ж это за Phenix такой.