On Tue, Mar 27, 2012 at 8:21 PM, Jeremiah Willcock <jewillco@osl.iu.edu> wrote:
On Tue, 27 Mar 2012, Robert Jones wrote:

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.

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.