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.