|
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> >
>>
>>etc.
>
>
> 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
instance:
"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<
Iterator
, is_same<
mpl::_
, typename iterator_value<Iterator>::type&
>
>
{
};
-- Daniel Wallin
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk