www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - "this" member for structs with methods

reply "simendsjo" <simendsjo gmail.com> writes:
When a struct contains methods, __traits(allMembers reports a 
member called "this". What is "this"?

void main() {
     struct S { int i; }
     struct A { int i; void f() {} }
     pragma(msg, __traits(allMembers, S)); // i
     pragma(msg, __traits(allMembers, A)); // i, f, this
}
Mar 17 2013
parent reply "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Sunday, 17 March 2013 at 12:16:08 UTC, simendsjo wrote:
 When a struct contains methods, __traits(allMembers reports a 
 member called "this". What is "this"?

 void main() {
     struct S { int i; }
     struct A { int i; void f() {} }
     pragma(msg, __traits(allMembers, S)); // i
     pragma(msg, __traits(allMembers, A)); // i, f, this
 }
This is context pointer. Move outside of function to not to have it.
Mar 17 2013
parent reply "simendsjo" <simendsjo gmail.com> writes:
On Sunday, 17 March 2013 at 13:30:29 UTC, Maxim Fomin wrote:
 On Sunday, 17 March 2013 at 12:16:08 UTC, simendsjo wrote:
 When a struct contains methods, __traits(allMembers reports a 
 member called "this". What is "this"?

 void main() {
    struct S { int i; }
    struct A { int i; void f() {} }
    pragma(msg, __traits(allMembers, S)); // i
    pragma(msg, __traits(allMembers, A)); // i, f, this
 }
This is context pointer. Move outside of function to not to have it.
Should it be included? The documentation is a bit sparse: http://dlang.org/traits.html#allMembers, but every member listed there are methods in the class or from Object. No hidden this or vtbl shows in the example.
Mar 17 2013
parent "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Sunday, 17 March 2013 at 14:27:32 UTC, simendsjo wrote:
 On Sunday, 17 March 2013 at 13:30:29 UTC, Maxim Fomin wrote:
 On Sunday, 17 March 2013 at 12:16:08 UTC, simendsjo wrote:
 When a struct contains methods, __traits(allMembers reports a 
 member called "this". What is "this"?

 void main() {
   struct S { int i; }
   struct A { int i; void f() {} }
   pragma(msg, __traits(allMembers, S)); // i
   pragma(msg, __traits(allMembers, A)); // i, f, this
 }
This is context pointer. Move outside of function to not to have it.
Should it be included? The documentation is a bit sparse: http://dlang.org/traits.html#allMembers, but every member listed there are methods in the class or from Object. No hidden this or vtbl shows in the example.
Yes, it should be documented explicitly. I think it should be included because there is actually a special member which has runtime storage and listing "this" does not make much harm, indeed it can be useful (probably some phobos code depend on this). Vtbl can be accessed anyway and class is reference type, so comparing allMembers for structs and classes is not very good.
Mar 17 2013