boost::lambda
От: nen777w  
Дата: 07.05.11 11:51
Оценка:
Помогите разобраться

struct S {
  S(int v) : val(v) {}
  int val;
};

S a(10), b(15);

namespace bl = boost::lambda;
( bl::if_then_else( (&bl::_1 ->* &S::val) == 10 && (&bl::_2 ->* &S::val) == 10 , true, false )( a, b );


т.е. можно было бы сделать так:

((&bl::_1 ->* &S::val) == 10 && (&bl::_2 ->* &S::val) == 10))(a,b)


но хочется разобраться со всеми этими if_then_else, switch_statment и т.п.
Re: boost::lambda
От: jazzer Россия Skype: enerjazzer
Дата: 07.05.11 12:02
Оценка:
Здравствуйте, nen777w, Вы писали:

N>но хочется разобраться со всеми этими if_then_else, switch_statment и т.п.


Тебе горит или просто интересуешься? Если просто — то дождись выхода третьего феникса: там будет все то же самое, но по-человечески сделанное.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: boost::lambda
От: nen777w  
Дата: 07.05.11 12:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, nen777w, Вы писали:


N>>но хочется разобраться со всеми этими if_then_else, switch_statment и т.п.


J>Тебе горит или просто интересуешься? Если просто — то дождись выхода третьего феникса: там будет все то же самое, но по-человечески сделанное.


нет не горит, просто интересуюсь, решил за 3-м заходом таки взять MPL

А что такое феникс?
Re[3]: boost::lambda
От: jazzer Россия Skype: enerjazzer
Дата: 07.05.11 13:18
Оценка:
Здравствуйте, nen777w, Вы писали:

N>нет не горит, просто интересуюсь, решил за 3-м заходом таки взять MPL

давно пора

N>А что такое феникс?


феникс — это лямбда из спирита.
третья версия будет целиком на Boost.Proto и будет самостоятельной библиотекой (а не в составе спирита), в идеале заменящей и Boost.Bind, и Boost.Lambda.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: boost::lambda, ещё вопросы
От: nen777w  
Дата: 07.05.11 14:06
Оценка:
Допустим имеется:

    struct S {
        S(int idx) : index(idx) {}
        int index;
    };

    int arr[] = {1,2,3,4,5};

    typedef std::vector<S> v_S;

    v_S v;
    v.push_back( S(4) );
    v.push_back( S(2) );
    v.push_back( S(1) );
....


Теперь Я хочу отсортировать этот вектор, но по значениям которые находятся в arr[] т.е. используя S::index — как индекс в arr[]

    namespace bl = boost::lambda;

    std::sort( v.begin(), v.end(),
        ( arr[ /*вот тут не пойму как достать значение из анонимного функционального объекта*/ (&bl::_1 ->* &S::index)] < arr[ /*аналогично*/ (&bl::_2 ->* &S::index)])
    );


Спасибо.
Re[2]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 07.05.11 15:20
Оценка:
сам себе и отвечу посидел ещё раз над докой. оказывается всё достаточно просто:

std::sort( v.begin(), v.end(),
        ( bl::var(arr)[(&bl::_1 ->* &S::index)] < bl::var(arr)[(&bl::_2 ->* &S::index)] )
);
Re[3]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 08.05.11 09:31
Оценка:
Здравствуйте, nen777w, Вы писали:

N>сам себе и отвечу посидел ещё раз над докой. оказывается всё достаточно просто:


N>
N>std::sort( v.begin(), v.end(),
N>        ( bl::var(arr)[(&bl::_1 ->* &S::index)] < bl::var(arr)[(&bl::_2 ->* &S::index)] )
N>);
N>



Теперь Я хочу вот так:

    struct SVal {
        SVal( int v ) : val(v) {}
        int value() const { return val; }
    private:
        int val;
    };

    //int arr[] = {5,4,1};
    SVal arr[] = { SVal(5), SVal(4), SVal(1) };

    typedef std::vector<S> v_S;

    v_S v;
    v.push_back( S(0) );
    v.push_back( S(1) );
    v.push_back( S(2) );

    namespace bl = boost::lambda;


должно быть что то вроде такого, но не получается
_1 = (bl::var(arr)[(&bl::_1 ->* &S::index)]), bl::bind(&SVal::value, _1)
Re[3]: boost::lambda, ещё вопросы
От: MasterZiv СССР  
Дата: 08.05.11 11:17
Оценка: 1 (1) +5
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)] )
> );

Это по-твоему просто ?
Это по-твоему естественно ?

По-моему так уродство.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 08.05.11 11:24
Оценка:
Здравствуйте, 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>По-моему так уродство.


это уже философский вопрос. на самом деле если не понимать синтаксис то выглядит конечно страшновато, но если немного почитать доку всё становится понятно.
Re[4]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 08.05.11 12:12
Оценка:
ыыыыы... MPL это круто

    std::sort( v.begin(), v.end(),
        ( bl::bind(&SVal::value, bl::var(arr)[(&bl::_1 ->* &S::index)]) < bl::bind(&SVal::value, bl::var(arr)[(&bl::_2 ->* &S::index)]) )
    );
Re[2]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 09.05.11 12:49
Оценка: 1 (1)
lambda рулит!!!

enum eside {
    s_left = 0, s_top, s_right, s_bottom
};

struct axs_info
{
    axs_info( unsigned int rc_index_, eside side_ ) : rc_index(rc_index_), side(side_) {}
    
    //rectangle index
    unsigned int rc_index;
    eside        side;
};

struct point_idx {
    unsigned int idx_l, idx_t, idx_r, idx_b;
};


Код без lambda:

    for( unsigned int n = 0; n < rc_ptidx.size()*2; ++n )
    {
        axs_info& xinf = axis_x[n];
        switch( xinf.side )
        {
        case s_left: rc_ptidx[xinf.rc_index].idx_l = n; break;
        case s_right: rc_ptidx[xinf.rc_index].idx_r = n; break;
        }
        axs_info& yinf = axis_y[n];
        switch( yinf.side )
        {
        case s_top: rc_ptidx[yinf.rc_index].idx_t = n; break;
        case s_bottom: rc_ptidx[yinf.rc_index].idx_b = n; break;
        }
    }


Код с lambda:

    unsigned int n = 0;
    bl::for_loop( bl::var(n) = 0, bl::var(n)<rc_ptidx.size()*2, ++bl::var(n), (
            bl::switch_statement( ( &bl::var(axis_x)[bl::var(n)] ->* &axs_info::side)
                , bl::case_statement<s_left>( &bl::var(rc_ptidx)[(&bl::var(axis_x)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_l = bl::var(n) )
                , bl::case_statement<s_right>( &bl::var(rc_ptidx)[(&bl::var(axis_x)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_r = bl::var(n) )
            ) ,
            bl::switch_statement( ( &bl::var(axis_y)[bl::var(n)] ->* &axs_info::side)
                , bl::case_statement<s_top>( &bl::var(rc_ptidx)[(&bl::var(axis_y)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_t = bl::var(n) )
                , bl::case_statement<s_bottom>( &bl::var(rc_ptidx)[(&bl::var(axis_y)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_b = bl::var(n) )
            )
        ) 
    )();


Офигительная штука!! Ух.


Модераторам:
Сори за эти посты, просто как говорят — если хочешь запомнить поделись ещё с кем нибудь.
Я кидаю это потому как поиск здесь по boost::lambda дал ну очень мало и не сильно отличающееся от стандартной документации.
Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.
Re[3]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 09.05.11 12:59
Оценка:
сразу же вопрос:

Хотелось бы уйти от повторения: 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'


пока не пойму почему, похоже нужно копать по исходникам в глубь библиотеки.

    unsigned int n = 0;
    bl::for_loop( bl::var(n) = 0, bl::var(n)<rc_ptidx.size()*2, ++bl::var(n), (
            bl::_1 = bl::var(axis_x)[bl::var(n)],
            bl::switch_statement( ( &bl::_1 ->* &axs_info::side)
                , bl::case_statement<s_left>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_l = bl::var(n) )
                , bl::case_statement<s_right>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_r = bl::var(n) )
            ) ,
            bl::switch_statement( ( &bl::var(axis_y)[bl::var(n)] ->* &axs_info::side)
                , bl::case_statement<s_top>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_t = bl::var(n) )
                , bl::case_statement<s_bottom>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_b = bl::var(n) )
            )
        ) 
    )();
Re[3]: boost::lambda, ещё вопросы
От: ilvi Россия  
Дата: 09.05.11 15:10
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Код с lambda:


N>
N>    unsigned int n = 0;
N>    bl::for_loop( bl::var(n) = 0, bl::var(n)<rc_ptidx.size()*2, ++bl::var(n), (
N>            bl::switch_statement( ( &bl::var(axis_x)[bl::var(n)] ->* &axs_info::side)
N>                , bl::case_statement<s_left>( &bl::var(rc_ptidx)[(&bl::var(axis_x)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_l = bl::var(n) )
N>                , bl::case_statement<s_right>( &bl::var(rc_ptidx)[(&bl::var(axis_x)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_r = bl::var(n) )
N>            ) ,
N>            bl::switch_statement( ( &bl::var(axis_y)[bl::var(n)] ->* &axs_info::side)
N>                , bl::case_statement<s_top>( &bl::var(rc_ptidx)[(&bl::var(axis_y)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_t = bl::var(n) )
N>                , bl::case_statement<s_bottom>( &bl::var(rc_ptidx)[(&bl::var(axis_y)[bl::var(n)] ->* &axs_info::rc_index)] ->* &point_idx::idx_b = bl::var(n) )
N>            )
N>        ) 
N>    )();
N>


N>Офигительная штука!! Ух.


Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...
Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?
Re[4]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 09.05.11 16:37
Оценка:
N>>Офигительная штука!! Ух.

I>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...

На самом деле почитав документацию всё становится достаточно понятно, так что страшных закорючек бояться не стоит. Люди вот например как то же пишут на Perl-е а там синтаксис по круче будет.

I>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?

Мне просто интересно разобраться было. Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.
lambda — это способ объявить функциональный объект, т.е. объект ведущий себя как функция.
Пока Я вижу в этом их применение, но теперь наверняка со временем применяя её в той или иной ситуации можно будет постепенно расширить и способы её использования.
Может те кто давно в теме ещё что то подскажут.
Re[5]: boost::lambda, ещё вопросы
От: Masterkent  
Дата: 09.05.11 20:38
Оценка:
nen777w:

I>>Я раньше думал, что использование лямбды должно упрощать код... Теперь в сомнениях...

N>На самом деле почитав документацию всё становится достаточно понятно

Вот только понять, что делает нормальный читабельный код, можно гораздо быстрее. С поиском ошибки — если таковая возникла — аналогично.

I>>Кроме того, что получилось в коде заюзать лямбду не детским образом, какие-нибудь дополнительные профиты это принесло?

N>Мне просто интересно разобраться было.

Вот-вот, из академического интереса побаловаться можно, но чтобы использовать на практике — ну на фиг такое счастье.

N>Из профитов гм.. например если lambda использовать совместно с <algorithm> это позволит не писать отдельных функторов, делать их сразу по месту.


Большое достижение, однако...
Re[3]: boost::lambda, ещё вопросы
От: night beast СССР  
Дата: 10.05.11 08:58
Оценка:
Здравствуйте, nen777w, Вы писали:

N>lambda рулит!!!


N>Офигительная штука!! Ух.


ты эту офигительную штуку на производительность не тестировал?
Re[4]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 10.05.11 10:03
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, nen777w, Вы писали:


N>>lambda рулит!!!


N>>Офигительная штука!! Ух.


NB>ты эту офигительную штуку на производительность не тестировал?

а зачем? В документации по boost::lambda и так видно что существует небольшое падение производительнсти по сравнению с самописными функторами.
Но мне это не критично, когда допишу полный алгоритм тогда и потестирую.
Re[5]: boost::lambda, ещё вопросы
От: night beast СССР  
Дата: 10.05.11 11:03
Оценка:
Здравствуйте, nen777w, Вы писали:

N>>>lambda рулит!!!


N>>>Офигительная штука!! Ух.


NB>>ты эту офигительную штуку на производительность не тестировал?

N>а зачем? В документации по boost::lambda и так видно что существует небольшое падение производительнсти по сравнению с самописными функторами.

цифры в доках не смотри, они не обновлялась хз сколько лет.

N>Но мне это не критично, когда допишу полный алгоритм тогда и потестирую.


было бы интересно.
Re[3]: boost::lambda, ещё вопросы
От: _nn_ www.nemerleweb.com
Дата: 11.05.11 13:06
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.

+1

А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 11.05.11 17:00
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, nen777w, Вы писали:


N>>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.

__>+1
__>А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть

А это не для начальства. Это для себя.

А то что на работе... еле с 6-ки (сколько на мозги капал) переползли на 2008-ю... и то немецкую версию подсунули
Re[6]: boost::lambda, ещё вопросы
От: s.ts  
Дата: 17.05.11 21:11
Оценка: +1
Здравствуйте, 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 )
ну и т.п.

как-то так.
Re: boost::lambda
От: Ka3a4oK  
Дата: 18.05.11 08:54
Оценка: +2
Мой совет — не используйте boost::lambda. Это будет сыпать непонятными сообщениями в случае какой-то ошибки и очень долго компилироваться.
Re[2]: boost::lambda
От: Ka3a4oK  
Дата: 18.05.11 08:56
Оценка:
Ну и естественно это будет нечитаемо и не неотлаживаемо.
Re[4]: boost::lambda, ещё вопросы
От: Ka3a4oK  
Дата: 19.05.11 20:38
Оценка: +2 :))) :)
N>
N>    unsigned int n = 0;
N>    bl::for_loop( bl::var(n) = 0, bl::var(n)<rc_ptidx.size()*2, ++bl::var(n), (
N>            bl::_1 = bl::var(axis_x)[bl::var(n)],
N>            bl::switch_statement( ( &bl::_1 ->* &axs_info::side)
N>                , bl::case_statement<s_left>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_l = bl::var(n) )
N>                , bl::case_statement<s_right>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_r = bl::var(n) )
N>            ) ,
N>            bl::switch_statement( ( &bl::var(axis_y)[bl::var(n)] ->* &axs_info::side)
N>                , bl::case_statement<s_top>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_t = bl::var(n) )
N>                , bl::case_statement<s_bottom>( &bl::var(rc_ptidx)[(&bl::_1 ->* &axs_info::rc_index)] ->* &point_idx::idx_b = bl::var(n) )
N>            )
N>        ) 
N>    )();
N>


... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: boost::lambda
От: nen777w  
Дата: 19.05.11 22:47
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Мой совет — не используйте boost::lambda. Это будет сыпать непонятными сообщениями в случае какой-то ошибки и очень долго компилироваться.


Сообщение об ошибках действительно не совсем что бы читаемы. Но всегда можно выделить кусок в котором происходит ошибка и постараться понять почему она происходит.
Потом с опытом ошибок становится намного меньше а со временем исчезают совсем.

KK>Ну и естественно это будет нечитаемо и не неотлаживаемо.


Да нормально всё с этой lambda. Ну да синтаксис сложноват. Но если вникнуть то не так и сложно на самом деле.
Я вокруг неё достаточно долго ходил, синтаксис очень отпугивал, больше предпочитал boost::bind.
Потом вдруг захотелось разобраться, один выходной и все стало значительно понятней.
Re[4]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 21.05.11 13:34
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, nen777w, Вы писали:


N>>Более сложные приём использования этой офигенной библиотеки, думаю также будут полезны ещё кому-то.

__>+1

__>А может просто убедите начальство переходить на GCC 4.5 / VS 2010 а там и нормальные лямбды есть


Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: boost::lambda, ещё вопросы
От: MasterZiv СССР  
Дата: 28.05.11 17:44
Оценка:
On 09.05.2011 19:10, ilvi wrote:

> Я раньше думал, что использование лямбды должно упрощать код... Теперь в

> сомнениях...

везде, кроме С++.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: boost::lambda, ещё вопросы
От: MasterZiv СССР  
Дата: 28.05.11 17:45
Оценка:
On 09.05.2011 20:37, nen777w wrote:

> На самом деле почитав документацию всё становится достаточно понятно, так что

> страшных закорючек бояться не стоит. Люди вот например как то же пишут на Perl-е
> а там синтаксис по круче будет.

Пишут, запускают, работает, что надо исправить -- пишут снова с нуля,
потому как разобраться уже невозможно. Ты тоже так хочешь ?
Posted via RSDN NNTP Server 2.1 beta
Re[7]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 03:56
Оценка:
Здравствуйте, 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>ну и т.п.

Нет, это неверно. boost::bind также поддерживает простые операторы сравнения и логические операторы: http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html#operators
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 03:57
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Что такое "нормальные лямбды"? Имхо, нормальные лямбды — это полиморфные, а не то, что в С++0х, когда надо явно типы прописывать.


IMHO лучше типы прописывать, чем извращаться с boost::lambda
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[6]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 30.05.11 05:07
Оценка: 1 (1)
Здравствуйте, 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.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: boost::lambda, ещё вопросы
От: s.ts  
Дата: 30.05.11 06:43
Оценка: +1
Здравствуйте, 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’
}
Re[9]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 17:13
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>Нет, это верно


Да, извиняюсь. Не заметил, что оператор сравнения в примере применялся к плейсхолдеру
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[7]: boost::lambda, ещё вопросы
От: ArtDenis Россия  
Дата: 30.05.11 17:16
Оценка:
Здравствуйте, 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х уже начинают рулить.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 30.05.11 19:12
Оценка:
Здравствуйте, 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 (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: boost::lambda, ещё вопросы
От: FR  
Дата: 31.05.11 09:45
Оценка:
Здравствуйте, jazzer, Вы писали:

AD>>Первый читабельнее. Но это очень простой вариант, поэтому он выглядит более выигрышным. Но если потребуется что-то посложнее простого сравнения, то безымянные ф-ции С++0х уже начинают рулить.


J>Он и является выигрышным. Нужны полиморфные лямбды, встроенные в язык, тогда все будет супер.


Вообще-то эти вещи друг-другу не мешают, неплохо бы и частичное применение как в первом варианте
(или лучше с поддержкой компилятора: _ < _) и нормальные лямбды.
Re[9]: boost::lambda, ещё вопросы
От: _nn_ www.nemerleweb.com
Дата: 31.05.11 10:06
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).


Когда уже выйдет этот Boost.Phoenix ? Все ждем..
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 31.05.11 10:08
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, jazzer, Вы писали:


J>>Так что единственный вариант (кроме ручного кодирования) на сегодняшний день для полиморфного функтора — это Boost.Lambda (ну или грядущий Boost.Phoenix).


__>Когда уже выйдет этот Boost.Phoenix ? Все ждем..


Да вроде планировали на след. неделе слепить boost 1.47.0, там он уже будет...
А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме
Proto рулит
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: boost::lambda, ещё вопросы
От: _nn_ www.nemerleweb.com
Дата: 31.05.11 12:09
Оценка:
Здравствуйте, 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>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 31.05.11 13:35
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?


Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.

J>>А пока можно полюбоваться на то, как с ним работать, см. презентацию с BoostCon'11 в соседнем форуме

J>>Proto рулит

__><offtop>Лучше бы уже С++ улучшили, чтобы не делать такие извращения.</offtop>


Ну чтоб улучшить С++ до такого уровня, чтоб Прото с Фениксом стал не нужен — это реолючия целая, сравнимая с концепцтами по масштабам.
Хотя я бы не отказался, конечно
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 03.06.11 23:46
Оценка:
__>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?
J>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.

ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать?
просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.
Re[14]: boost::lambda, ещё вопросы
От: jazzer Россия Skype: enerjazzer
Дата: 04.06.11 07:52
Оценка:
Здравствуйте, nen777w, Вы писали:

__>>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?

J>>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.

N>ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать?

N>просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.

Не понял вопроса, что с algorithm и functional?
Феникс предоставит функциональность как Boost.Lambda, так и Boost.Bind.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[15]: boost::lambda, ещё вопросы
От: nen777w  
Дата: 04.06.11 08:08
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, nen777w, Вы писали:


__>>>>Т.е. Boost.Lambda, Boost.Bind скоро можно будет выкинуть ?

J>>>Вроде как. У лямбды своих чисто технических проблем хватает, и я надеюсь, что Феникс их решит. Вроде как все к тому шло.

N>>ээээ ну здрасте выкинуть а с <algorithm>, <functional> чо делать?

N>>просто lambda иногда позволяет записать функционал по месту, Я бы рассматривал это как дополнительное расширение возможностей для записи сложных выражений.

J>Не понял вопроса, что с algorithm и functional?

J>Феникс предоставит функциональность как Boost.Lambda, так и Boost.Bind.

А, понял. Спасибо.
Сейчас как раз по SVN затягиваю boost хочу посмотреть что ж это за Phenix такой.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.