Boost logo

Boost :

Subject: Re: [boost] request: BOOST_NO_SFINAE_EXPR macro
From: Beman Dawes (bdawes_at_[hidden])
Date: 2009-07-31 19:36:02


On Fri, Jul 31, 2009 at 11:52 AM, Simonson, Lucanus
J<lucanus.j.simonson_at_[hidden]> wrote:
> Beman Dawes wrote:
>> On Thu, Jul 30, 2009 at 10:20 AM, Mathias
>> Gaunard<mathias.gaunard_at_[hidden]> wrote:
>>> It would be very nice if Boost.Config provided the
>>> BOOST_NO_SFINAE_EXPR macro, that would be defined if the compiler
>>> does not support SFINAE applied to expressions.
>>> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html
>>>
>>> GCC supports this feature since 4.4 both for C++03 and C++0x for
>>> example.
>>
>> Yes, such a macro is needed
>
> So we could do this instead of use mpl and?
>
> template <typename T1, typename T2>
> enable_if_c<is_a_A<T1>::value && is_a_B<T2>::value>::type foo();
>
>> Also, it turns out that the ability to provide a default template
>> parameter for function templates markedly clarifies code using
>> enable_if. (I learned this Howard Hinnant, but I think he may have
>> gotten the idea from Peter Dimov.)
>
> This sounds interesting.  Can you explain how?

The example from Howard is below. Note that the enable_if code is
moved out of the function signature and into a default template
parameter.

--Beman

#define requires(...) class = typename std::enable_if<(__VA_ARGS__)>::type

template <class T>
struct underlying
{
    typedef typename remove_cv<typename remove_reference<T>::type>::type type;
};

// forward with <type_traits>

template <class T, class U,
    requires(!is_lvalue_reference<T> ||
              is_lvalue_reference<T> && is_lvalue_reference<U>),
    requires(is_same<typename underlying<T>::type,
                     typename underlying<U>::type>)>
inline
T&&
forward(U&& t)
{
    return static_cast<T&&>(t);
}


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