Function name as text

Don Clugston dac at nospam.com.au
Thu Dec 6 02:31:20 PST 2007


Bill Baxter wrote:
> Don Clugston wrote:
>> 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);
>>
> 
> Really?  Can you take the stringof an alias parameter and get back 
> "foo.bar" ?  If so then nifty!
> 
> --bb

Unfortunately it's not quite so simply, since there are so many bugs in 
.stringof. I'm unable to get the 'foo'.
----
class Foo
{
     void bar(int d) {}
}

void GetName(alias F)()
{
     pragma(msg, (&F).stringof); // prints "& bar"
}

void main()
{
     GetName!(Foo.bar);
}
----
I have however done this previously using .mangleof to retrieve the fully 
qualified name. The behaviour with alias template parameters was one of the 
parts of my NameOf module which didn't get into .stringof. Sure would be nice if
F.stringof worked.



More information about the Digitalmars-d mailing list