On Wed, Mar 14, 2012 at 02:44:40PM -0400, Steven Schveighoffer wrote:
> On Wed, 14 Mar 2012 14:16:11 -0400, H. S. Teoh
> <hst...@quickfur.ath.cx> wrote:
> 
> >What I want is to force the compiler to deduce S=dstring when I
> >declare func(S)(S) and call it as func("abc").
> 
> http://d.puremagic.com/issues/show_bug.cgi?id=4998
> 
> Please vote or contribute your thoughts.
[...]

Ahhh, thanks for pointing this out. That is exactly the problem I'm
struggling with.

I guess the motivation of my original question wasn't clear. I should
say that I ran into this problem in the context of my AA implementation.
I've successfully implemented Andrei's suggestion: int[wstring] will now
accept wchar[], const(wchar)[], in addition to wstring in .get,
.opIndex, etc.. It will implicitly call wchar[].idup when it needs to
create a new hash entry. (Ditto with dstring, and with any immutable
array key type.)

To implement this change, opIndexAssign now looks like this:

        struct AssociativeArray(Key,Value) {
                ...
                void opIndexAssign(K)(in Value v, in K key)
                        if (isCompatWithKey!K)
                {
                        ...
                }
        }

The template isCompatWithKey basically checks if K can be implicitly
converted to Key, or has an .idup method that returns something that can
be implicitly converted to Key.

However, this change broke this code:

        AssociativeArray!(wstring,int) aa;
        aa["abc"] = 123;        // error: compiler deduces K as string,
                                // so isCompatWithKey!K fails: string
                                // can't implicitly convert to wstring

Whereas before, when opIndexAssign looked like this:

                void opIndexAssign(in Value v, in Key key)
                {
                        ...
                }

everything worked, because the compiler deduces the type of "abc" as
wstring since Key==wstring.

Now you have to write:

        aa["abc"w] = 123;

which isn't the end of the world, I suppose, but it's not very nice, and
also breaks existing code that depended on the compiler automatically
deducing that typeof("abc")==wstring.


T

-- 
There are three kinds of people in the world: those who can count, and those 
who can't.

Reply via email to