On Tue, Mar 27, 2012 at 5:02 PM, Jeremiah Willcock <jewillco@osl.iu.edu> 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.