
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@gmail.com> 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