<div><div>Robert, I tried .stringof and it didn't quite get me as far as I wanted. </div><div><br></div><div>But the using a template got me much closer:</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div><div><font class="Apple-style-span" face="'courier new', monospace">unittest</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  {</font></div></div><div><div>
<font class="Apple-style-span" face="'courier new', monospace">  //create bob to kick off the whole thing</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  new Bob();</font></div>
</div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">  }</span></div><div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div></div><div>
<div><font class="Apple-style-span" face="'courier new', monospace">class Base</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  {</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">    // find all the derived members and run them</font></div>
</div><div><font class="Apple-style-span" face="'courier new', monospace">    // Base doesn't have to know anything about the derived classes</font></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">    public void runallin(alias T) ()</span></div>
<div><div><font class="Apple-style-span" face="'courier new', monospace">    {</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">      void delegate() dg;</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">      //create a delegate and run it </font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">      foreach (i, m; __traits(derivedMembers, T))</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">        {</font></div>
</div><div><font class="Apple-style-span" face="'courier new', monospace">        //skip ctor, no need to run it again.</font></div><div><div><font class="Apple-style-span" face="'courier new', monospace">        if (m != "__ctor")</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">          {</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">          writeln("== i=", i, "  m=", m);</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">          </font></div></div><div><font class="Apple-style-span" face="'courier new', monospace">          //by trial and error, I found I need to use</font></div>
<div><div><font class="Apple-style-span" face="'courier new', monospace">          //    5 + the number of methods in class Base (exclude ctor)</font></div></div><div><font class="Apple-style-span" face="'courier new', monospace">          //right now, no additional methods, so 5 it is.</font></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">          dg.funcptr = cast(void function()) this.classinfo.vtbl[i + 5];</span></div><div><div><font class="Apple-style-span" face="'courier new', monospace">          dg.ptr = cast(void*) this;</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">          writeln("   calling dg");</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">          dg();</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">          }</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">        }</font></div></div>
<div><div><font class="Apple-style-span" face="'courier new', monospace">    }</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  }</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">// the class to auto-run</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">class Bob: Base</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">  {</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  this()</font></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">    {</span></div>
</div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">    runallin!Bob;</span></div><div><div><font class="Apple-style-span" face="'courier new', monospace">    }</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">  </font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">  public void inBob1()</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">      {</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">        writeln("   in bob : inBob1()");</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">      }</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div></div><div>
<div><font class="Apple-style-span" face="'courier new', monospace">  public void inBob2()</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">    {</font></div></div>
<div><div><font class="Apple-style-span" face="'courier new', monospace">      writeln("   in bob : inBob2()");</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">    }</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">  }</font></div></div></blockquote><div><br></div><div>Here's the output:</div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div><div><font class="Apple-style-span" face="'courier new', monospace">== i=1  m=inBob1</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">   calling dg</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">   in bob : inBob1()</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">== i=2  m=inBob2</font></div>
</div><div><div><font class="Apple-style-span" face="'courier new', monospace">   calling dg</font></div></div><div><div><font class="Apple-style-span" face="'courier new', monospace">   in bob : inBob2()</font></div>
</div></blockquote><div><br></div><div>Getting closer. Next:</div><div>- check the signature of the methods (I want to run void fn(void) only)</div><div>- find all the classes in a given module so I don't have to "new Bob()"</div>
<div><br></div><div>Thanks for everyone's help,</div><div>John</div><div><br></div><div><br></div><div><div class="gmail_quote">On Sun, Oct 23, 2011 at 9:21 AM, Robert Jacques <span dir="ltr"><<a href="mailto:sandford@jhu.edu">sandford@jhu.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Sun, 23 Oct 2011 02:59:48 -0400, J Arrizza <<a href="mailto:cppgent0@gmail.com" target="_blank">cppgent0@gmail.com</a>> wrote:<br>

<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
The idea here was to create a base class. That base class would have a<br></div>
function register() which took a function name or function pointer, and<div class="im"><br>
create a delegate at compile time. register() would add the delegate  and<br>
the function name as a string into the hash. At runtime, I pass in the<br>
string, get the delegate and invoke the function.<br>
<br>
So I need both the function name as a symbol (to create the delegate) and<br></div>
the function name as a string. In c++ I'd use the preprocessor to convert<div class="im"><br>
the symbol to a string via "#" (stringify).<br>
<br></div>
If D doesn't have this, the callers will have to do:<br>
<br>
     register(bob, "bob");<br>
<br><div class="im">
which is a little tedious.<br>
<br>
BTW I tried:<br>
<br>
   public void register(string name)   {<br>
     auto func = __traits(getMember, this, name);<br>
<br>
but __traits() only works at compile time, but variable name is only<br>
available at run-time....<br>
<br>
John<br>
</div></blockquote>
<br>
Okay, I'm a little confused about exactly what you want to do, but I think you want something like:<br>
<br>
string foo(alias T)() {<br>
    T++;<br>
    return T.stringof;<br>
}<br>
<br>
int x = 0;<br>
assert(foo!x == "x");<br>
assert(x == 1);<br>
<br>
alias template parameters give you access to actual variables/functions, which is what you seem to be asking for.<br>
</blockquote></div><br>
</div>