Function name as text

Don Clugston dac at nospam.com.au
Thu Dec 6 00:10:14 PST 2007


Craig Black wrote:
> "Bill Baxter" <dnewsgroup at billbaxter.com> wrote in message 
> news:fj769h$7ou$1 at digitalmars.com...
>> Craig Black wrote:
>>> I have been considering porting some C++ code to D.  One of the classes I 
>>> would have to port is an event queue class where each event on the queue 
>>> has a delegate and a text string that points to the function name that 
>>> the delegate refers to.  The function name is used to visualize the event 
>>> queue for run-time debugging purposes.  It is important to capture both 
>>> the class name and the function name as text.
>>>
>>> In C++ I had a macro called DISPATCH that used the stringize operator # 
>>> to capture the name of the function.  The good (and bad) thing about C++ 
>>> in this case is that when specifying a pointer to a member, you must 
>>> fully qualify the function name, so you would have something like this.
>>>
>>> class Foo {
>>> public:
>>>   void bar() {}
>>> };
>>>
>>> Foo *foo = new Foo;
>>> Event event = DISPATCH(foo, &Foo::bar);
>>>
>>> Using the stringize operator, the DISPATCH macro could capture the text 
>>> string "Foo::bar" as well as the member function pointer.  Here is the 
>>> equivalent code in D..
>>>
>>> Foo foo = new Foo;
>>> Event event = dispatch(&foo.bar);
>>>
>>> Which is much more elegant, except that I can't figure out a way to 
>>> capture the name of the function and it's class.  I tried fiddling with 
>>> the stringof operator but that doesn't seem to work.
>>>
>>> Any ideas?
>> There probably isn't a way to do it right now without using a string 
>> mixin, which uglies things up on the calling side:
>>
>>      Event event = mixin(dispatch("&foo.bar"));
>>
>> Macros are supposed to give us a way to clean that up.  But for now you're 
>> probably better off just passing the name separately like 
>> dispatch(&foo.bar, "foo");
>>
>> --bb
> 
> I guess that's not so bad.  It would be.
> 
> Foo *foo = new Foo;
> Event event = dispatch(&foo.bar, "Foo.bar");
> 
> That is probably easier on the eyes than the mixin syntax.  It stilll would 
> be cool if the compiler could somehow build the name automatically.

Or you could use an alias template parameter, to give the syntax:

Event event = dispatch!(foo.bar);




More information about the Digitalmars-d mailing list