digitalmars.D.learn - Function definition in multiple modules
- Martin Drasar (17/17) Mar 29 2012 Hi,
- simendsjo (23/40) Mar 29 2012 D has interface files, .di. These can be automatically generated by the ...
- Martin Drasar (40/64) Mar 29 2012 Hi,
- simendsjo (25/46) Mar 29 2012 (snip)
- Martin Drasar (17/42) Mar 29 2012 I was thinking about similar idea. But instead of alias this I intended
- simendsjo (15/57) Mar 29 2012 You can also use opDispatch and __traits(getMember, ..). Don't know if i...
- Martin Drasar (7/19) Mar 29 2012 I should have thought and experiment more before writing. Did a quick
Hi, I have a class that implements a lot of interfaces and I would like to separate the definition into different files, i.e. implementation of one interface in one file. Something akin to this C++ code: a.cpp: class A { void b(); void c(); }; b.cpp: void A::b() {} c.cpp: void A::c() {} Is there a way to do it in D easily? Do I have to use UFCS? Thanks, Martin
Mar 29 2012
On Thu, 29 Mar 2012 10:33:03 +0200, Martin Drasar <drasar ics.muni.cz> wrote:Hi, I have a class that implements a lot of interfaces and I would like to separate the definition into different files, i.e. implementation of one interface in one file. Something akin to this C++ code: a.cpp: class A { void b(); void c(); }; b.cpp: void A::b() {} c.cpp: void A::c() {} Is there a way to do it in D easily? Do I have to use UFCS? Thanks, MartinD has interface files, .di. These can be automatically generated by the compiler using the -H switch. So you code your class normally: a.d: class A { void a() {} void b() {} } $ dmd -H a.d $ cat a.di // D import file generated from 'a.d' class A { void a() { } void b() { } }
Mar 29 2012
On 29.3.2012 11:16, simendsjo wrote:D has interface files, .di. These can be automatically generated by the compiler using the -H switch. So you code your class normally: a.d: class A { void a() {} void b() {} } $ dmd -H a.d $ cat a.di // D import file generated from 'a.d' class A { void a() { } void b() { } }Hi, I have probably not made myslef clear. Let's say I have this D code: interfaces.d: interface IA { void a(); } interface IB { void b(); } myfunkyclass.d: import interfaces; class X : IA, IB { void a() { } void b() { } } I would like to split the X class definition into two files. One file would implement methods of interface IA and another of interface IB. So it would be like this: myfunkyclassIA.d: class X : IA, IB { void a() { } } myfunkyclassIB.d: void b(X x) { } Except using UFCS in this case does not work... Martin
Mar 29 2012
On Thu, 29 Mar 2012 11:31:57 +0200, Martin Drasar <drasar ics.muni.cz> wrote:On 29.3.2012 11:16, simendsjo wrote:(snip)D has interface files, .di. These can be automatically generated by the compiler using the -H switch.I would like to split the X class definition into two files. One file would implement methods of interface IA and another of interface IB. So it would be like this: myfunkyclassIA.d: class X : IA, IB { void a() { } } myfunkyclassIB.d: void b(X x) { } Except using UFCS in this case does not work... MartinYour looking for partial classes? D doesn't have this as far as I know. "alias this" should work for more than one value in the future, and then (I think) you should be able to do something like this: class XIB : IB {} class XIA : IA {} class X : IA, IB { XIA xia; XIB xib; alias xia this; alias xib this; } But you can also solve it with mixin templates: mixin template XIA { // all IA methods } mixin template XIB { // all IB methods } class X : IA, IB { mixin XIA!(); mixin XIB!(); }
Mar 29 2012
On 29.3.2012 12:02, simendsjo wrote:Your looking for partial classes? D doesn't have this as far as I know. "alias this" should work for more than one value in the future, and then (I think) you should be able to do something like this: class XIB : IB {} class XIA : IA {} class X : IA, IB { XIA xia; XIB xib; alias xia this; alias xib this; }I was thinking about similar idea. But instead of alias this I intended to write something like this: class X : IA, IB { XIA xia; void iamethod() { xia.iamethod(); } ... } It is not very pretty though...But you can also solve it with mixin templates: mixin template XIA { // all IA methods } mixin template XIB { // all IB methods } class X : IA, IB { mixin XIA!(); mixin XIB!(); }This would make the code separation easy to manage, but I am concerned about debugging. How is e.g. gdb able to debug mixins? I think I have read somewhere in the D or D-learn, that the dmd can produce the file with mixed-in code for the debugger, but I am not sure how to find it. Martin
Mar 29 2012
On Thu, 29 Mar 2012 12:58:56 +0200, Martin Drasar <drasar ics.muni.cz> wrote:On 29.3.2012 12:02, simendsjo wrote:You can also use opDispatch and __traits(getMember, ..). Don't know if it works when implementing interfaces though.Your looking for partial classes? D doesn't have this as far as I know. "alias this" should work for more than one value in the future, and then (I think) you should be able to do something like this: class XIB : IB {} class XIA : IA {} class X : IA, IB { XIA xia; XIB xib; alias xia this; alias xib this; }I was thinking about similar idea. But instead of alias this I intended to write something like this: class X : IA, IB { XIA xia; void iamethod() { xia.iamethod(); } ... }It is not very pretty though...It's not string mixins: mixin template XIA() { void a() { ... } // regular function } class X : IA { mixin XIA!() } XIA is injected into X, so X now looks like class X : IA { void a() { ... } }But you can also solve it with mixin templates: mixin template XIA { // all IA methods } mixin template XIB { // all IB methods } class X : IA, IB { mixin XIA!(); mixin XIB!(); }This would make the code separation easy to manage, but I am concerned about debugging. How is e.g. gdb able to debug mixins? I think I have read somewhere in the D or D-learn, that the dmd can produce the file with mixed-in code for the debugger, but I am not sure how to find it. Martin
Mar 29 2012
On 29.3.2012 13:05, simendsjo wrote:It's not string mixins: mixin template XIA() { void a() { ... } // regular function } class X : IA { mixin XIA!() } XIA is injected into X, so X now looks like class X : IA { void a() { ... } }I should have thought and experiment more before writing. Did a quick test and the gdb jumps nicely into the mixin template. So the debugging is a breeze. Thanks simendsjo for your help. I think that I know now everything I needed. Regards Martin
Mar 29 2012