Boost logo

Boost Users :

Subject: Re: [Boost-users] [Concepts & EnableIf] Is void special?
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2012-03-27 15:21:50

On Tue, 27 Mar 2012, Robert Jones wrote:

> On Tue, Mar 27, 2012 at 5:02 PM, Jeremiah Willcock <jewillco_at_[hidden]> wrote:
> On Tue, 27 Mar 2012, Robert Jones wrote:
> Hi Peeps
> Can anyone cast any light on this...
> I want to write function which accepts a single pass range of X's, so something like this
> struct X { };
> template <typename T>
>         (( boost::SinglePassRangeConcept<T> )),
>         ( typename boost::enable_if<boost::is_same<typename boost::range_value<T>::type, X>, void>::type ))
>     my_function( const T & range );
> Is that a reasonable construction, or is there a better way to say it?
> Next, it doesn't seem to work. It does seem to work if the type to which enable_if resolves is anything
> except void, but not for void. Why is this?
> Does it only fail if you try to pass something in that is not a range? I'm not sure that BOOST_CONCEPT_REQUIRES does SFINAE, but if it does, you will need a
> metafunction (and possibly lazy_enable_if) to avoid accessing range_value<T> when T is not a range if that doesn't instantiate properly for non-ranges.
> No, it fails when the parameter IS a valid range, of the required value type. I can create the same effect by
> substituting void for the whole enable_if bit, and then using BOOST_ASSERT in the body of the function to impose
> the same condition, but that is obviously less satisfactory.
> I suspect void is special because it is enable_if's returned type if type is not specified, but I can't quite see why, or
> what the impact of that is.

Does it still fail even if you don't use BOOST_CONCEPT_REQUIRES? If the
function fails only with a void return type, are you sure you're not
trying to return something (at least along some control flow path)? What
in particular is the error message you get?

-- Jeremiah Willcock

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at