Boost logo

Boost Users :

Subject: Re: [Boost-users] [Concepts & EnableIf] Is void special?
From: Robert Jones (robertgbjones_at_[hidden])
Date: 2012-03-28 03:42:32


On Tue, Mar 27, 2012 at 8:21 PM, Jeremiah Willcock <jewillco_at_[hidden]>wrote:

> 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_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.
>>
>
> 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?
>
>
No. I can use the enable_if part without the BOOST_CONCEPT_REQUIRES and
it's fine. I can use the BOOST_CONCEPT_REQUIRES bit and then use a simple
void
in place of the enable_if and that's fine too. Together, not fine! I'm
going to take a little time to construct a minimal self contained example.

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