On Wednesday, 7 September 2022 at 15:35:29 UTC, Andrej Mitrovic wrote:
> As mentioned in the previous reply it seems that a function typedef trips it up. If there was a way to filter it out, that'd be great.
I think the root of the problem here is that std.traits.isFunction
does not do exactly what you're assuming it does. Specifically, it evaluates to true
for both function symbols and function types:
import std.traits;
void fun() {}
static assert(isFunction!fun); // ok
static assert(isFunction!(typeof(fun))); // also ok!
In order to filter for just function symbols, you need to use a more elaborate test:
static if (
is(typeof(&__traits(getMember, Module, member)) PtrType)
&& isFunctionPointer!PtrType
) {
GetFunctionList = AliasSeq!(GetFunctionList, PtrType);
}
This first checks whether you can take the member's address, and then, if you can, checks whether the type of that address is a function pointer. If I use the condition above in your reduced example, it compiles successfully, and the resulting list does not include the typedef
.