Pop quiz, what does this do?

Steven Schveighoffer schveiguy at gmail.com
Wed Mar 3 16:46:13 UTC 2021


On 3/3/21 11:33 AM, 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?
>>>
>>
>> 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 :)

It works as designed. It's the design I question.

For instance, code like:

foreach(m; FieldNameTuple!T)
    // do something with __traits(getMember, T, m)

will fail. Not because FieldNameTuple complains that it can't have field 
names, but because of what it's hard-coded to do.

-Steve


More information about the Digitalmars-d mailing list