Boost logo

Boost :

Subject: [boost] enable_if question
From: John Maddock (boost.regex_at_[hidden])
Date: 2012-05-08 11:56:28


Folks I'm having some difficulties understanding the subtleties of
enable_if, consider:

using namespace boost;

template <unsigned B>
struct dummy
{};

template <unsigned B, class Integer>
typename boost::enable_if<mpl::and_<is_signed<Integer>,
mpl::bool_<(sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const
Integer&)
{
}
template <unsigned B, class Integer>
typename boost::enable_if<mpl::and_<is_unsigned<Integer>,
mpl::bool_<(sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const
Integer&)
{
}

Then calling:

dummy<2> d;
bar(d, 2);

Leads to an ambiguity between the two overloads (both gcc and VC++10), how
can that be?

However, changing the condition to:

template <unsigned B, class Integer>
typename boost::enable_if<mpl::and_<is_signed<Integer>, mpl::bool_<(B || !B)
&& (sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const
Integer&)
{
}
template <unsigned B, class Integer>
typename boost::enable_if<mpl::and_<is_unsigned<Integer>, mpl::bool_<(B ||
!B) && (sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const
Integer&)
{
}

"fixes" things. But this fix isn't always possible. Thoughts?

Thanks, John.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk