Boost logo

Boost Users :

Subject: [Boost-users] [Boost][enable_if] SFINAE and decltype
From: Germán Diago (germandiago_at_[hidden])
Date: 2011-04-28 15:45:17


Hi all,

I'm having a hard time trying to figure out how to make a code like
this to improve error
messages through static_assert. I want that when the function
instantiation fails, the other
function's static assert fails. I don't know how to do it. I began
with something like this:

template <class Range, class T>
Range find(Range && haystack, const T & elem)
{
        static_assert(std::is_convertible<decltype (elem ==
haystack.front())>::value,
                           "elem and haystack must be equality comparable");
        while (!haystack.empty() && !(haystack.front() == elem))
                haystack.popFront();
        return haystack;
}

But that didn't work since when decltype is applied to an invalid
expression, SFINAE doesn't trigger
in the function body.

So now I'm trying an alternative like this, but I don't know how to express it:

template <class Range, class T>
Range find(Range && haystack, const T & elem,
decltype (elem == haystack.front()) * = 0)
{
        while (!haystack.empty() && !(haystack.front() == elem))
                haystack.popFront();
        return haystack;
}

template <class Range, class T>
Range find(Range && haystack, const T & elem,
!decltype (elem == haystack.front()) * = 0)
{
        static_assert(...,
                                  "haystack.front() and elem must be equality comparable");
        return haystack;
}

I can't figure out how to make it work. I also tried with
boost::enable_if but the problem is that
a bool expression doesn't have a ::value member.

Could anyone suggest me THE SIMPLEST and most readable way to make
this work? Thanks in advance.

P.S.: By the way, I also tried structs and partial specialization, but no luck.


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