Private functions and allMembers

TheFlyingFiddle kurtyan at student.chalmers.se
Fri Jan 3 10:52:22 PST 2014


On Friday, 3 January 2014 at 18:30:56 UTC, Carl wrote:
> Here is some test code:
>
> // --- start --- //
> // main.d //
> import std.stdio;
> import extra;
>
> void main()
> {
> 	void function() func;
>
> 	foreach(mem; __traits(allMembers, __traits(parent, test)))
> 	{
> 		foreach(att; __traits(getAttributes, mixin(mem)))
> 		{
> 			if(att == "good") func = &mixin(mem);
> 		}
> 	}
>
> 	if(func) func();
> 	else writeln("func not assigned");
> }
>
> // extra.d //
> import std.stdio;
>
> @("good")
> public void test()
> {
> 	writeln("test()");
> }
>
> @("bad")
> private void badtest()
> {
> }
> // --- end --- //
>
>
> main.d(13): Error: module main function extra.badtest is private
> main.d(15): Error: module main function extra.badtest is private
>
> I understand the need to prevent access to private members, but
> how does one work around this?
> Adding an if statment with __traits(compiles, mixin(mem)) still
> gives errors. However, pragma(msg... shows it does return false
> for the private function.


void main()
{
	void function() func;

	foreach(mem; __traits(allMembers, extra))
	{
		static if(__traits(compiles, mixin(mem)))
		foreach(att; __traits(getAttributes, mixin(mem)))
		{
			if(att == "good") func = &mixin(mem);
		}
	}

	if(func) func();
	else writeln("func not assigned");
}

This works for me. DMD 2.064.2



More information about the Digitalmars-d-learn mailing list