On 11/12/2014 12:24 a.m., Vlasov Roman wrote:
On Wednesday, 10 December 2014 at 10:34:25 UTC, Marc Schütz wrote:
On Wednesday, 10 December 2014 at 09:41:43 UTC, Rikki Cattermole wrote:
On 10/12/2014 10:10 p.m., Vlasov Roman wrote:
I have this code

import std.stdio;

mixin template Template(void function() func1, void function() func2) {

   void     to() {
       func1();
       func2();
   }
};

class SomeClass {
   mixin Template!(&func, &func23);

   void func() {
       writeln("First function!");
   }

   void func23() {
       writeln("First function!");
   }

   void toTemplate() {
       to();
   }
}

void main() {
   SomeClass a = new SomeClass();

   a.toTemplate();
}

After running the program give me SIGSEGV in func23();

Terminal with gdb:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000428352 in invariant._d_invariant(Object) ()
(gdb) up
#1  0x00000000004257f7 in main.SomeClass.func23() ()


Manjaro Linux 0.9.0 x86_64
dmd 2.066
Kernel 3.14.4

Ugh, that's a compiler bug.
You should not be able to pass in delegates as function pointers to a
mixin template.

A better way would be to pass in the names of the methods into the
mixin template and then use string mixin's to call the methods.

Better yet, try this:

mixin template Template(void delegate() func1, void delegate() func2)

I tried this, but compiler give me error

main.d(12): Error: no 'this' to create delegate for func
main.d(12): Error: no 'this' to create delegate for func23

I think that error because i don't completly know dlang

This is why I didn't suggest this myself.
Basically you are trying to take a pointer to a function that takes an argument (this). But a delegate is not exactly that. A delegate is a function pointer + this pointer as well.
Essentially you can't do this for a type.

Reply via email to