|
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