March 03, 2021
On 3/3/21 11:52 AM, Dukc wrote:
> On Wednesday, 3 March 2021 at 16:06:48 UTC, Steven Schveighoffer wrote:
> 
>> import std.traits;
>>
>> interface I
>> {
>>    int foo();
>> }
>>
>> pragma(msg, FieldNameTuple!I);
>>
>> Without looking up the docs, or trying it, what do you think it does?
> 
> I'd think it either returns nothing, or the typeid and monitor fields (or whatever they are)  that all classes are supposed to have.

It does neither of those things.

-Steve
March 03, 2021
On Wed, Mar 03, 2021 at 11:06:48AM -0500, Steven Schveighoffer via Digitalmars-d wrote:
> The FieldNameTuple from std.traits returns a tuple of names of all the fields that are present on a type instance.
> 
> What about the result on things that can't have fields?
> 
> import std.traits;
> 
> interface I
> {
>    int foo();
> }
> 
> pragma(msg, FieldNameTuple!I);
> 
> Without looking up the docs, or trying it, what do you think it does?
[...]

My guess was it should be an empty tuple.

Boy was I surprised. :-(

I dug through the git history and found the original PR:

	https://github.com/dlang/phobos/pull/2561

Somebody asked why an empty string instead of an empty tuple, and the submitter said he would change it, but then someone else said to keep consistency, and apparently it was subsequently overlooked or just left at an empty string.

My gut feeling is, this should be changed to an empty tuple. It really makes no sense otherwise, and is a strange corner case like the kind deadalnix mentioned that will lead to pain down the road.


T

-- 
A mathematician is a device for turning coffee into theorems. -- P. Erdos
March 03, 2021
On Wednesday, 3 March 2021 at 17:17:52 UTC, Simen Kjærås wrote:
> On Wednesday, 3 March 2021 at 16:33:35 UTC, Stefan Koch wrote:
>> On Wednesday, 3 March 2021 at 16:31:53 UTC, Stefan Koch wrote:
>>> On Wednesday, 3 March 2021 at 16:06:48 UTC, Steven Schveighoffer wrote:
>>>> The FieldNameTuple from std.traits returns a tuple of names of all the fields that are present on a type instance.
>>>>
>>>> What about the result on things that can't have fields?
>>>>
>>>> import std.traits;
>>>>
>>>> interface I
>>>> {
>>>>    int foo();
>>>> }
>>>>
>>>> pragma(msg, FieldNameTuple!I);
>>>>
>>>> Without looking up the docs, or trying it, what do you think it does?
>>>>
>>>> -Steve
>>>
>>> My feeling is that it returns tuple("foo").
>>> But based on the name that probably shouldn't happen.
>>
>> Huh ... it works as it should in this case.
>> Pleasant surprise :)
>
> No it doesn't. Look again.
>
> --
>   Simen

:p I actually expected tuple("") :)
Don't ask me why.

Of course when trying to the result for anything that's bogus.
But using phobos introspection templates always leads to pain, so it's a good thing to teach people not to do that :)
1 2
Next ›   Last »