Function name as text
Craig Black
cblack at ara.com
Thu Dec 6 07:52:16 PST 2007
"Bill Baxter" <dnewsgroup at billbaxter.com> wrote in message
news:fj8dlo$2fuj$2 at digitalmars.com...
> 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
Sorry to be picky, but getting back the string "foo.bar" is not sufficient.
I need the name of the class, not the instance name.
More information about the Digitalmars-d
mailing list