digitalmars.D.learn - get type name from current class at compile time?
- Jack (35/35) Apr 24 2021 ```d
- =?UTF-8?Q?Ali_=c3=87ehreli?= (13/14) Apr 24 2021 This is solved by the "this template parameter":
- Jack (3/17) Apr 24 2021 good one Ali, thanks. Where is this template parameter documented
- Jack (21/35) Apr 24 2021 doesn't this work when called from member in a derived class?
- Jack (2/44) Apr 24 2021 I can call doSomething!(typeof(this)), I can live with that
- Paul Backus (3/23) Apr 24 2021 It works if you call it with `this.doSomething()`:
- Jack (2/31) Apr 24 2021 that's better, thanks
- Adam D. Ruppe (10/11) Apr 25 2021 Imporant to remember that any compile time thing will be the
- Jack (3/10) Apr 25 2021 I find out this later. I give up trying to get this in automatic
- Adam D. Ruppe (4/6) Apr 25 2021 That's because the type might not be known at compile time at
```d class A { void showMyName() { writefln("name = [%s]", __traits(identifier, typeof(this))); } } class K : A { } ``` then ```d new K().showMyName(); ``` output: name = [A] I'd like to output `K` and get this identifier at compile time. But I'd to do so automatically so rule out something like: ```d class A { string name = __traits(identifier, typeof(this)); void showMyName() { writefln("name = [%s]", name); } } class K : A { this() { super.name = __traits(identifier, typeof(this)); } } ```
Apr 24 2021
On 4/24/21 6:50 PM, Jack wrote:I'd like to output `K` and get this identifier at compile time.This is solved by the "this template parameter": import std.stdio; class A { void showMyName(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { } void main() { new K().showMyName(); } Ali
Apr 24 2021
On Sunday, 25 April 2021 at 02:02:47 UTC, Ali Çehreli wrote:On 4/24/21 6:50 PM, Jack wrote:good one Ali, thanks. Where is this template parameter documented at?I'd like to output `K` and get this identifier at compile time.This is solved by the "this template parameter": import std.stdio; class A { void showMyName(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { } void main() { new K().showMyName(); } Ali
Apr 24 2021
On Sunday, 25 April 2021 at 02:02:47 UTC, Ali Çehreli wrote:On 4/24/21 6:50 PM, Jack wrote:doesn't this work when called from member in a derived class? ```d class A { void doSomething(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { void baa() { doSomething(); } } ``` result in the error: Error: template `foo.A.doSomething` cannot deduce function from argument types `!()()`,I'd like to output `K` and get this identifier at compile time.This is solved by the "this template parameter": import std.stdio; class A { void showMyName(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { } void main() { new K().showMyName(); } Ali
Apr 24 2021
On Sunday, 25 April 2021 at 02:26:00 UTC, Jack wrote:On Sunday, 25 April 2021 at 02:02:47 UTC, Ali Çehreli wrote:I can call doSomething!(typeof(this)), I can live with thatOn 4/24/21 6:50 PM, Jack wrote:doesn't this work when called from member in a derived class? ```d class A { void doSomething(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { void baa() { doSomething(); } } ``` result in the error: Error: template `foo.A.doSomething` cannot deduce function from argument types `!()()`,I'd like to output `K` and get this identifier at compile time.This is solved by the "this template parameter": import std.stdio; class A { void showMyName(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { } void main() { new K().showMyName(); } Ali
Apr 24 2021
On Sunday, 25 April 2021 at 02:26:00 UTC, Jack wrote:doesn't this work when called from member in a derived class? ```d class A { void doSomething(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { void baa() { doSomething(); } } ``` result in the error: Error: template `foo.A.doSomething` cannot deduce function from argument types `!()()`,It works if you call it with `this.doSomething()`: https://run.dlang.io/is/eIygNG
Apr 24 2021
On Sunday, 25 April 2021 at 02:45:38 UTC, Paul Backus wrote:On Sunday, 25 April 2021 at 02:26:00 UTC, Jack wrote:that's better, thanksdoesn't this work when called from member in a derived class? ```d class A { void doSomething(this T)() { writefln("name = [%s]", __traits(identifier, T)); } } class K : A { void baa() { doSomething(); } } ``` result in the error: Error: template `foo.A.doSomething` cannot deduce function from argument types `!()()`,It works if you call it with `this.doSomething()`: https://run.dlang.io/is/eIygNG
Apr 24 2021
On Sunday, 25 April 2021 at 03:45:13 UTC, Jack wrote:that's better, thanksImporant to remember that any compile time thing will be the static type. If someone does: Base a = new Derived(); a.something(); it will still show up as Base in the this template. The knowledge that it is actually a Derived thing is not there at compile time. (well ok it kind of is, like the compiler's optimizer can still piece it together by following the flow, but it is no longer known to any template after that assignment.)
Apr 25 2021
On Sunday, 25 April 2021 at 08:36:51 UTC, Adam D. Ruppe wrote:On Sunday, 25 April 2021 at 03:45:13 UTC, Jack wrote:I find out this later. I give up trying to get this in automatic way at compile timethat's better, thanksImporant to remember that any compile time thing will be the static type. If someone does: Base a = new Derived(); a.something(); it will still show up as Base in the this template.
Apr 25 2021
On Sunday, 25 April 2021 at 12:54:43 UTC, Jack wrote:I find out this later. I give up trying to get this in automatic way at compile timeThat's because the type might not be known at compile time at all, it might come from like a plugin loaded at run time and only ever accessed through the interface.
Apr 25 2021