[Issue 12408] map does not like inout

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Mar 20 02:02:27 PDT 2014


https://d.puremagic.com/issues/show_bug.cgi?id=12408



--- Comment #4 from monarchdodra at gmail.com 2014-03-20 02:02:14 PDT ---
(In reply to comment #3)
> I thought that the whole point of using inout was to avoid having to
> copy-paste code between mutable, const, and immutable functions?

Yes, that's it's design, but it's not magic either. It makes it so that a
single *implementation* can work as mutable or immutable.

What you are asking for is actually 3 different implementations (3 different
return types).

At least, that's how I understood the issue. Maybe bring it up on learn to see
if I'm wrong.

That said, please think about your design, and what it means to have
const/non-const overloads that return different types.

> As you've described
> (unless I'm misunderstanding), I should copy-paste
> 
> @property auto foo() inout nothrow pure @safe {
>    return arr.map!(e => e.fun(this));
> }
> 
> as mutable, const, and nothrow.  Shouldn't this be something which should be
> fixed with inout and/or templates themselves?

Maybe there is a template solution, but (AFAIK) templates don't have the
capability of conditionally tagging things as const or not.

I'd have thought mixin templates could solve this, like this:

//----
    mixin template fooImpl()
    {
        auto foo()
        {
           return l(a);
        }
    }

    mixin fooImpl!();
    const mixin fooImpl!();
    immutable mixin fooImpl!();
//----

But apparently, the qualifiers are ignored, and this simply creates the same
function 3 times.

So I don't see anything other than string mixins :/

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list