|
Boost Users : |
Subject: Re: [Boost-users] Generically comparing structs
From: Bill Buklis (boostuser_at_[hidden])
Date: 2009-08-27 19:21:22
> -----Original Message-----
> From: Steven Watanabe [mailto:watanabesj_at_[hidden]]
> Sent: Thursday, August 27, 2009 4:57 PM
> To: boost-users_at_[hidden]
> 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 --
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net