|
Boost : |
Subject: Re: [boost] [concept] "not" and "or" concept constraints (N2081)
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2010-05-28 15:38:09
On Fri, May 28, 2010 at 12:02 PM, David Abrahams <dave_at_[hidden]> wrote:
> At Fri, 28 May 2010 11:31:09 -0400,
> Lorenzo Caminiti wrote:
>>
>> Hello all,
>>
>> How can I use Boost.ConceptCheck to implement "not" and "or" concept
>> constraints as they are defined in N2081?
>
> A. You can't, not with Boost.ConceptCheck.
>
> B. Those are a really bad idea anyway. It's been proven
> mathematically that the use of or constraints would lead to a
> combinatorial explosion at typechecking time.
Wow, I'll make sure to stay away from "not"/"or" concept constraints then.
>> (If this is obvious from the documentation, please just point me to the link.)
>>
>> For example, how can I program the following code from N2081 using
>> Boost.ConceptCheck:
>>
>> // "not" `!` concept constraint for some concept C (not C++ code).
>> template<Regular T> where !C<T> void f(T x) { ... }
>>
>> // "or" `||` concept constraint (not C++ code).
>> template<Regular T> where Integral<T> || Floating<T> T cos(T x) { ... }
>>
>> If I understand it right, I can program the "and" concept constraints
>> in Boost.ConceptCheck just by specifying multiple concepts as in:
>>
>> // "and" `&&` concept constraint.
>> template<typename T>
>> BOOST_CONCEPT_REQUIRES( ((boost::Integral<T>)) ((boost::
>> Arithmetic<T>)),
>> T) f(T x) { ... }
>>
>> But how do I use BOOST_CONCEPT_REQUIRES(), etc to program "not" and
>> "or" concept constraints?
>
> Boost.ConceptCheck generates errors aggressively, which means you
> can't use BOOST_CONCEPT_REQUIRES in an overloading context where one
> overload's requirements might not be satisfied. For this use case you
> need to use type traits, MPL, and enable_if.
Yes, I see. Thanks.
-- Lorenzo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk