-----Original Message----- From: Steven Watanabe [mailto:watanabesj@gmail.com] Sent: Thursday, August 27, 2009 4:57 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] Generically comparing structs
AMDG
Bill Buklis wrote:
If one of the members was a C-style string, how can I override the comparison to use strcmp or equivalent?
It would be easy if you could pass a predicate to less. Unfortunately Boost.Fusion doesn't provide such an overload. I've adapted the implementation of less. See attached.
In Christ, Steven Watanabe
Thanks very much for taking the time for that adaptation. Unfortunately a lot of these strings are actually char arrays rather than pointers (way too much legacy code left). I couldn't figure out how to make BOOST_FUSION_ADAPT_STRUCT recognize the types (one of those array vs pointer differences), but then I realized it doesn't really matter for this case. I can make this work using vector_tie and a simple wrapper. It's nowhere near as elegant, but it seems to work. Any thoughts on potential problems that I might be missing? See below: struct char_wrapper { const char * str; char_wrapper( const char* str ) : str(str) {} bool operator<( const char_wrapper& rhs ) const { return(strcmp(str, rhs.str) < 0); } }; struct s { int a, b; char c[20]; }; bool operator<( const s& lhs, const s& rhs ) { // sort in order of b,a,c return( boost::fusion::vector_tie(lhs.b, lhs.a, char_wrapper(lhs.c)) < boost::fusion::vector_tie(rhs.b, rhs.a, char_wrapper(rhs.c)) ); } -- Bill --