restrict alias this?
Namespace
rswhite4 at googlemail.com
Sun Apr 29 10:47:54 PDT 2012
On Sunday, 29 April 2012 at 17:29:03 UTC, Simen Kjaeraas wrote:
> On Sun, 29 Apr 2012 14:28:05 +0200, Namespace
> <rswhite4 at googlemail.com> wrote:
>
>> On Sunday, 29 April 2012 at 11:24:00 UTC, Simen Kjaeraas wrote:
>>> On Sun, 29 Apr 2012 10:14:09 +0200, Namespace
>>> <rswhite4 at googlemail.com> wrote:
>>>
>>>> Based on my previous thread
>>>> (http://forum.dlang.org/thread/rpcqefmyqigftxsgsqui@forum.dlang.org),
>>>> I got the question whether it is possible to restrict "alias
>>>> this"?
>>>> Similar to templates function, e.g. "void foo(T)(T value) if
>>>> (isNumeric!(T) ...", but it should be limited here so that
>>>> it does not interact with the cast or something other.
>>>> As far as I know, "alias this" is an implicit cast. And just
>>>> like an explicit cast (opCast) it should be possible to
>>>> restrict it.
>>>>
>>>> Otherwise, I have unfortunately run out of ideas how I can
>>>> allow an implicit conversion.
>>>
>>> What do you mean restrict it?
>>
>> I mean that you can limit it similar as you can with
>> templates. In my code i'm using "alias this" to enable an
>> implicit conversion from any class, e.g. Foo, to Ref!Foo. Ref
>> is an struct which checks if the value of Foo is null. If it's
>> null a error message will let you know, that you have a
>> problem with one of your objects (i hate the access violation
>> message, that's the original reason for that).
>>
>> But if i cast with a class, that implements the implicit
>> conversion, as in the following:
>>
>> [code]
>> class A {
>> mixin TRef!(A);
>> }
>>
>> class B : A { }
>>
>> A a1 = new B();
>>
>> B b1 = cast(B) a1.access; // <- problem
>> [/code]
>>
>> the cast will implicit convert with "alias this" to Ref!B. And
>> that isn't what i want and neither what should happen. In this
>> case a limit to "alias this" would be great. A limitation,
>> that "alias this" must not convert the cast to Ref!B.
>
> But that's not what happens. a1's compile-time type is A, so
> the compiler looks
> up 'access' in A, but finds nothing. So it tries the alias
> this, gets a Ref!A,
> and calls access on that. At this point, T is A, so access
> returns an A.
>
> Then, the compiler tries to convert that A to a B, and gets
> confused. This is
> absolutely a bug. In fact, it is the bug Jesse Phillips
> reported[1].
>
>
> [1]: http://d.puremagic.com/issues/show_bug.cgi?id=8001
Yes, I've just noticed that. Are there already workarounds for
that problem?
More information about the Digitalmars-d-learn
mailing list