|
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