Boost logo

Boost :

From: Daniel Wallin (dalwan01_at_[hidden])
Date: 2004-09-11 06:23:12

David Abrahams wrote:
> Daniel Wallin <dalwan01_at_[hidden]> writes:
>>I have been toying with a more general solution to this problem, where
>>one can do things like:
>> check_dereference<T, is_convertible<mpl::_, U&> >
>> check_add<T, T, is_convertible<mpl::_, T> >
> That *might* be impressive if I could tell what those expressions were
> supposed to mean ;-)

The metafunction class is applied to the result type of the operation,
and is required to have boolean result. For instance:

   struct X
       void operator+(X const&) const;
       X operator+(int) const;

   template<class T> struct Y : mpl::false_ {};
   template<> struct Y<X> : mpl::true_ {};

   check_add<X, X, Y<mpl::_> >::type // X + X, invokes Y<void> -> false
   check_add<X, int, Y<mpl::_> >::type // X + int, invoked Y<X> -> true

Using this we could express more complicated concept checks. For

"The Lvalue Iterator concept adds the requirement that the return type
  of operator* type be a reference to the value type of the iterator."

    template<class Iterator>
    struct is_iterator_lvalue_dereferencable
        : check_dereference<
            , is_same<
                , typename iterator_value<Iterator>::type&

Daniel Wallin

Boost list run by bdawes at, gregod at, cpdaniel at, john at