Boost logo

Boost Users :

Subject: Re: [Boost-users] [Concepts & EnableIf] Is void special?
From: Robert Jones (robertgbjones_at_[hidden])
Date: 2012-03-27 14:19:15


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_CONCEPT_REQUIRES(
>> (( 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.

Thx, Rob.



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