|
Boost : |
Subject: Re: [boost] Provisional Boost.Generic and Boost.Auto_Function (concepts without concepts)
From: Dave Abrahams (dave_at_[hidden])
Date: 2010-12-15 14:19:43
At Tue, 14 Dec 2010 07:41:17 -0500,
Matt Calabrese wrote:
>
> On Tue, Dec 14, 2010 at 7:11 AM, Matt Calabrese <rivorus_at_[hidden]> wrote:
>
> > Anyway, I've said more than I wanted to right now. I didn't expect this
> > thread to be bumped -- I was hoping to post a new thread about all of this
> > once everything was polished and up in the sandbox.
> >
>
> Actually, since this thread has started going again, I've hit some
> complicated issues regarding concept maps that I'd hope someone could help
> out with. In particular, there is one very troubling situation I've
> encountered. Imagine three concept types: a "base" concept,
concrete code helps:
concept Base<typename T>
{
T operator*(T, T);
};
> a "left" concept
> which is a refinement of "base", and a "right" concept, which is also a
> refinement of "base".
concept Left<typename T> : Base<T>
{
T operator-(T, T);
};
concept Right<typename T> : Base<T>
{
T operator+(T, T);
};
> A programmer creates a type called "foo" and wishes to
> make a concept map for "left" and also a concept map for "right".
struct foo {};
// This one would be an error, since foo doesn't have operator*
concept_map Left<foo>
{
foo operator-(foo,foo) { return 0; }
};
concept_map Right<foo>
{
foo operator+(foo,foo) { return 0; }
};
So how are you going to supply operator*? The answer to your question
depends on that.
> Because "left" is a refinement of "base", making a concept map for
> "left" implicitly makes a concept map for "base". Similarly, since
> "right" is a refinement of "base", the same thing happens. So the
> issue is, if someone now writes a function that requires a "base",
> which concept map is to be used?
I don't see a problem. If you answer the question by giving foo an
operator* of its own, the two implicitly-generated concept maps are
the same concept map.
> Should this be a compile-time error? If so, how could this possibly
> be safely resolved (does anyone know how this was handled in concept
> proposals)?
I need more information. Please try to write out a complete example
(using ConceptC++ syntax, please).
> Assuming it should be a compile-time error, would it be enough to just
> require a third concept map to be written, explicitly for base, or perhaps a
> way to specify explicitly that "right" should be used? If so, what happens
> when a function takes a "left" and that function references the parts of the
> concept map that are used to satisfy the requirements of "base"? I'd imagine
> that it would use the "left" concept map, but that means that a different
> concept map for "base" would be used depending on whether the function took
> a "base" or a "left" or a "right", which seems to be very wrong. Am I
> expressing this problem correctly? Does anyone see an obvious resolution
> that I've missed?
too many questions; too little code ;-)
-- Dave Abrahams BoostPro Computing http://www.boostpro.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk