On 1/24/2013 3:59 AM, boost-users-request-at-lists.boost.org |Boost/Allow to home| wrote:

> I just added my second metafunction of the form is_range_of_X<T> for use
> with enable_if, and although the first one took some fiddleing to pass
> both compilers I was using, the second was a clone of the first with the
> name and type changed. So it really ought to be a general purpose
> is_range_of<Whatever, T> metafunction.
I assume it it's simply something like
is_same<typename mpl::eval_if< is_range<T>, range_value<T>, void>::type, 
Whatever>

I ended up with:
template <typename Flag, typename T>
struct is_range_of_MYTHING2 : boost::mpl::false_ { };

template <typename T>
struct is_range_of_MYTHING2<boost::mpl::true_, T> {
   typedef typename boost::range_value<T>::type val_type;  // chokes here if T is not a range
   typedef typename is_convertible<val_type, MYTHING>::type type;
   };
template <typename T>
struct is_range_of_MYTHING : is_range_of_MYTHING2<typename boost::has_range_iterator<T>::type, T>
   { };
I'm familiar enough with type_traits, but not with all of Boost MPL.  Is eval_if a lazy-evaluation for short circuiting the AND of the two tests?

—John