$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Christian Henning (chhenning_at_[hidden])
Date: 2007-05-03 18:10:53
I know about this solution to my problem by defining a function
returning the value I'm looking for. See the get_id() function. My
question is is there a way of doing without defining such a function?
namespace fields
{
   struct _id_;
   struct _name_;
   struct _birthday_;
   struct _address_id_;
}
typedef fusion::map< fusion::pair< fields::_id_        , string >
                   , fusion::pair< fields::_name_      , string >
                   , fusion::pair< fields::_birthday_  , string >
                   , fusion::pair< fields::_address_id_, string >
                   > table_type;
const string& get_id( const table_type& t )
{
   return fusion::at_key< fields::_id_ >( t );
}
int main()
{
   table_type table;
   vector< table_type > vec;
   find_if( vec.begin()
          , vec.end()
          , bind( equal_to< string >()
                , bind( &get_id, _1 )
                , string( "Hallo" )));
   return 0;
}
On 5/3/07, Christian Henning <chhenning_at_[hidden]> wrote:
> Hi there, I have a problem ( compilation error ) using a fusion map
> with boost bind. Not sure if that is the intended usage. So, please
> show some mercy when I'm doing something totally stupid.
>
> Basically, I have a std::vector of a fusion::map instances. And I
> would like to find a fusion::map instance with a special value.
>
> Here is the code:
>
> #include <vector>
> #include <algorithm>
> #include <functional>
>
> #include <boost/bind.hpp>
>
> #include <boost/fusion/algorithm.hpp>
> #include <boost/fusion/sequence.hpp>
> #include <boost/fusion/iterator.hpp>
>
>
> using namespace std;
> using namespace boost;
>
> namespace fields
> {
>    struct _id_;
>    struct _name_;
>    struct _birthday_;
>    struct _address_id_;
> }
>
> typedef fusion::map< fusion::pair< fields::_id_        , string >
>                    , fusion::pair< fields::_name_      , string >
>                    , fusion::pair< fields::_birthday_  , string >
>                    , fusion::pair< fields::_address_id_, string >
>                    > table_type;
>
> int main()
> {
>    table_type table;
>
>    vector< table_type > vec;
>
>    find_if( vec.begin()
>           , vec.end()
>           , bind( equal_to< string >()
>                 , bind( &fusion::at_key< fields::_id_ >, _1 )
>                 , string( "Hallo" )));
>
>    return 0;
> }
>
> Does that makes sense? If yes, how would I do it?
>
> I'm using MSVC 7.1 and the first couple of compiler errors are:
>
> Compiling...
> test.cpp
> test.cpp(43) : error C2783: 'result_of::at_key<const
> Sequence,Key>::type boost::fusion::at_key(const Sequence &)' : could
> not deduce template argument for 'Sequence'
>         c:\boost\boost\fusion\sequence\intrinsic\at_key.hpp(50) : see
> declaration of 'boost::fusion::at_key'
> test.cpp(43) : error C2783:
> 'lazy_disable_if<boost::is_const<Sequence>,boost::fusion::result_of::at_key<Sequence,Key>>::type
> boost::fusion::at_key(Sequence &)' : could not deduce template
> argument for 'Sequence'
>         c:\boost\boost\fusion\sequence\intrinsic\at_key.hpp(43) : see
> declaration of 'boost::fusion::at_key'
> test.cpp(43) : error C2784:
> 'boost::_bi::bind_t<R,boost::_mfi::dm<R,T>,_bi::list_av_1<A1>::type>
> boost::bind(R T::* ,A1)' : could not deduce template argument for
> 'overloaded function type' from 'overloaded function type'
>         c:\boost\boost\bind.hpp(1616) : see declaration of 'boost::bind'
> [snip]
>
> Thanks for your patients,
> Christian
>