<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>