how to compose delegate type

Jesse Phillips Jesse.K.Phillips+D at gmail.com
Sat Dec 7 11:36:48 PST 2013


On Saturday, 7 December 2013 at 01:18:06 UTC, Ellery Newcomer 
wrote:
> On 12/05/2013 09:33 PM, Jesse Phillips wrote:
>>
>> I don't think I understand what you mean:
>
> this code illustrates it:
>
> class Z {
>     string a() immutable {
>         return " 1";
>     }
>     string b() {
>         return "2";
>     }
> }
>
> template F(t) {
>     alias immutable(t) F;
> }
> alias typeof(&Z.init.a) Texpected;
> alias typeof(&Z.init.a) T;
>
> static assert(is(F!(T) == Texpected));
>
> void main() {}
>
>
>
> above F doesn't work; immutable(void delegate()) and void 
> delegate() immutable are different types (I think the latter 
> means 'this' is immutable).
> If t were a function pointer, you would apply the immutable to 
> the pointer target like so:
>
> alias immutable(pointerTarget!t)* F

This declaration doesn't make sense to me:

     string a() immutable {
         return " 1";
     }

'a' is already immutable (unless you consider the vtable, at 
which point: final string a(); would be immutable).

The compiler spits out: static assert  (is(immutable(string 
delegate()) == string delegate() immutable)) is false

Which is strange because I don't see how immutability on 'a' 
means anything. And because of this I think your assertion is 
wrong:

     static assert(is(F!(T) == Texpected));

Is basically asking

     static assert(is(immutable(int) == int));

Which is not true, but this is (I've made modifications to your 
code):

class Z {
     string a() {
         return " 1";
     }
     string b() {
         return "2";
     }
}

template F(t) {
     alias immutable(t) F;
}
alias typeof(&Z.init.a) Texpected;
alias typeof(&Z.init.b) T;

static assert(is(immutable(int) : int)); // Implicitly converts to
static assert(is(int : immutable(int))); // Implicitly converts to
static assert(is(F!(T) : Texpected));    // Implicitly converts to
static assert(is(Texpected : F!(T) ));   // Implicitly converts to

void main() {}


More information about the Digitalmars-d-learn mailing list