allMembers and getMember traits behavior

Martin martinbbjerregaard at gmail.com
Fri Jun 21 06:50:01 PDT 2013


On Friday, 21 June 2013 at 13:42:44 UTC, Artur Skawina wrote:
> On 06/21/13 15:27, Martin wrote:
>> On Friday, 21 June 2013 at 13:15:43 UTC, Jacob Carlborg wrote:
>>> On 2013-06-21 15:04, Martin wrote:
>>>> module test;
>>>>
>>>> void test()
>>>> {
>>>>
>>>>
>>>>     foreach (member; __traits(allMembers, Client))
>>>>     {
>>>>         pragma(msg, member); // Prints all members fine, 
>>>> including "value"
>>>>     }
>>>>
>>>>     // This line fails
>>>>     static if(__traits(getProtection, __traits(getMember, 
>>>> TestClass,
>>>> "value")) == "public")
>>>>     {
>>>>         pragma(msg, "value is public");
>>>>     }
>>>>     else
>>>>     {
>>>>         pragma(msg, "value is not public");
>>>>     }
>>>>
>>>> }
>>>>
>>>> module testclass;
>>>>
>>>> class TestClass
>>>> {
>>>> private:
>>>>     int value;
>>>> }
>>>>
>>>> When using the allMembers trait, the private "value" member 
>>>> of TestClass
>>>> is included, but when trying to retrieve that member using 
>>>> the getMember
>>>> trait, it fails to compile with test.d(13): Error: class 
>>>> main.TestClass
>>>> member value is not accessible
>>>>
>>>> Is that intended behavior or a bug? I can't see why the 
>>>> getMember trait
>>>> should not be able to retrieve private members when 
>>>> allMembers trait is
>>>
>>> Can you use a string instead of getMember?
>> 
>> You mean something like this:
>> 
>> foreach (member; __traits(allMembers, TestClass))
>> {
>>     static if (member == "value")
>>     {
>>         pragma(msg, __traits(getProtection, member));
>>     }
>> }
>> 
>> That works, but it prints "public", even though the "value" 
>> member is private. Surprisingly strange behavior
>
>    pragma(msg, __traits(getProtection, mixin("TestClass." ~ 
> member)));
>
> artur

Thanks, that sort of works. It prints "private" but then 
immediately gives an error:
test.d(12): Error: class main.TestClass member value is not 
accessible

Sigh, this is DMD 2.063.2 by the way.


More information about the Digitalmars-d mailing list