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-ю... и то немецкую версию подсунули
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.