[ glorius @ 26.05.2016. 18:15 ] @
Prilicno mi je jasno kako rade spomenute funkcionalnosti boost lib-a i njihova medjusobna saradnja ali ce me mozda sledece pitanje demantovati :)
Naidjoh skoro na parcence koda koje izgleda slicno sledecem:

Code:


bool getState()
{
    return true;
}

void main()
{
     boost::function<bool()> func = !boost::bind(getState);
     std::cout << func();
}



Impresivno (bar za mene) rezultat je false.
Nije mi jasno kako boost::function uspeva da capture-uje i operator ! kada smesta funktor generisan binderom za delayed call.
Bilo bi mi jasno da se koristi funkc. kompozicija sa std::not1 npr ali za ovo nisam nasao objasnjenje kako funkcionise.

Razmisljao sam i o analogiji sa smestanjem lambda expressiona u boost::function...
Na primer:

Code:


boost::function<bool(bool)> func = !_1;
std::cout << func(true);



Ovo mi je jasno ali verzija sa bind nije.

[ Burgos @ 26.05.2016. 20:35 ] @
To je samo `operator!` primenjen na rezultat `boost::bind`, pa se takav veže za `func`:

Code:

struct logical_not
{
    template<class V> bool operator()(V const & v) const { return !v; }
};

template<class R, class F, class L>
    bind_t< bool, logical_not, list1< bind_t<R, F, L> > >
    operator! (bind_t<R, F, L> const & f)
{
    typedef list1< bind_t<R, F, L> > list_type;
    return bind_t<bool, logical_not, list_type> ( logical_not(), list_type(f) );
}



http://www.boost.org/doc/libs/1_49_0/boost/bind/bind.hpp
[ glorius @ 26.05.2016. 20:59 ] @
To je samo `operator!`

Da da... hvala!