www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - access enclosing type from shared static this()

reply =?UTF-8?B?IsOYaXZpbmQi?= <oivind.loe gmail.com> writes:
I want to access the type of the enclosing struct in in a shared 
static initializer.. How do I do that? The following code will 
not compile:

mixin template MsgMixin(T ...) {
   static string getName(this M)() {
     return M.stringof;
   }
   shared static this() {
     import std.stdio;
     writeln("register " ~ getName());
   }
}

struct MsgTestMsg {
   mixin MsgMixin!();
}

I get the following error messages:

src/main.d(40): Error: template 
main.MsgTestMsg.MsgMixin!().getName does not match any function 
template declaration
src/main.d(40): Error: template 
main.MsgTestMsg.MsgMixin!().getName(this M) cannot deduce 
template function from argument types !()()

If not possible, just getting the name of the enclosing struct 
would help a lot!

-Øivind
Sep 19 2012
next sibling parent David <d dav1d.de> writes:
 If not possible, just getting the name of the enclosing struct would
 help a lot!

 -Øivind

typeof(this).stringof This should do it
Sep 19 2012
prev sibling next sibling parent Timon Gehr <timon.gehr gmx.ch> writes:
On 09/19/2012 09:37 PM, "Øivind" wrote:
 I want to access the type of the enclosing struct in in a shared static
 initializer.. How do I do that? The following code will not compile:

 mixin template MsgMixin(T ...) {
    static string getName(this M)() {
      return M.stringof;
    }
    shared static this() {
      import std.stdio;
      writeln("register " ~ getName());
    }
 }

 struct MsgTestMsg {
    mixin MsgMixin!();
 }

 I get the following error messages:

 src/main.d(40): Error: template main.MsgTestMsg.MsgMixin!().getName does
 not match any function template declaration
 src/main.d(40): Error: template main.MsgTestMsg.MsgMixin!().getName(this
 M) cannot deduce template function from argument types !()()

 If not possible, just getting the name of the enclosing struct would
 help a lot!

 -Øivind

use typeof(this), eg: mixin template MsgMixin(T ...) { shared static this() { import std.stdio; writeln("register " ~ typeof(this).stringof); } }
Sep 19 2012
prev sibling parent =?UTF-8?B?IsOYaXZpbmQi?= <oivind.loe gmail.com> writes:
Thanks a lot both of you. The code below worked. I did not expect 
'this' to be available in the static function, but of course the 
type of 'this' is available.

 mixin template MsgMixin(T ...) {
     shared static this() {
         import std.stdio;
         writeln("register " ~ typeof(this).stringof);
     }
 }

Sep 19 2012