Boost logo

Boost Users :

From: Robert Dailey (rcdailey_at_[hidden])
Date: 2008-07-21 08:59:58


On Sun, Jul 20, 2008 at 11:24 PM, David Abrahams <dave_at_[hidden]> wrote:

>
> on Sun Jul 20 2008, "Robert Dailey" <rcdailey-AT-gmail.com> wrote:
>
> > Hi,
> >
> > I'm trying to create my own struct that is compatible with
> boost::mpl::or_ as well as
> > boost::enable_if.
> >
> > I find that using boost::mpl::or_ requires that my structure have a
> > 'type' member, and enable_if looks for 'value'.
>
> Both metafunctions are defined so they will work with an MPL integral
> constant
>
> http://www.boost.org/doc/libs/1_35_0/libs/mpl/doc/refmanual/integral-constant.html
>
> > Must I define both?
>
> Usually the best way to do this is to derive your struct from mpl::true_
> or mpl::false_ or some other bool-valued nullary MPL metafunction.
>
> > What is the proper way to handle this? Below is my structure:
> >
> > template< typename t_type >
> > struct is_sink
> > {
> > typedef typename boost::mpl::or_<
> > vfx::io::is_device<t_type>,
> > boost::is_same<t_type, vfx::io::Sink>
> > > type;
> ^
> missing "::type" here? Otherwise, the "typename" above is probably illegal
>
> > };
>
> provided of course that vfx::io::is_device<t_type> is a integral-valued
> nullary metafunction,
>
> template <class t_type>
> struct is_sink
> : mpl::or_<
> vfx::io::is_device<t_type>,
> boost::is_same<t_type, vfx::io::Sink>
> >
> {};
>
> > The above structure works perfectly fine with boost::mpl::or_, but
> > does not work for boost::enable_if because it is looking for a 'value'
> > member. I feel what it should be looking for is
> > is_sink::type::value. An example of how I use the above structure is
> > below:
> >
> > template< typename t_source, typename t_data >
> > typename boost::enable_if<
> > boost::mpl::and_<is_source<t_source>, boost::is_pod<t_data> >,
> > t_source
> >>::type& operator>> ( t_source& source, t_data& data )
> > {
> > source.Read( reinterpret_cast<boost::uint8_t*>( &data ), sizeof(
> t_data ) );
> > return source;
> > }
>
> I don't see is_sink in there.

Sorry, I posted the wrong code example. The is_source in there should be
is_sink.

I didn't find it very easy to find this answer myself via the boost
documentation, though I wish it had been. Thanks for everyone's help. I'll
try inheritance and see what I get.



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