Function name as text
Don Clugston
dac at nospam.com.au
Thu Dec 6 09:13:11 PST 2007
Craig Black wrote:
> "Don Clugston" <dac at nospam.com.au> wrote in message
> news:fj8j1p$2per$1 at digitalmars.com...
>> 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.
>
> I ran into this same thing with stringof. Are you sure that this is a bug?
It's hard to say. stringof was originally a 'hidden feature'/easter egg that
didn't get mentioned in the changelog. It's in the docs, but it behaves quite
differently from documented, except in simple cases.
> Has it been officially reported?
Not that I know of. Even most of the examples in the docs don't work as
advertised, so there hasn't been much motivation to report these secondary cases.
More information about the Digitalmars-d
mailing list