Understanding Safety of Function Pointers vs. Addresses of Functions

jmh530 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 13 18:05:19 PDT 2015


On Monday, 13 July 2015 at 02:52:11 UTC, Laeeth Isharc wrote:
>
> I am venturing in territory still new to me, but I think that 
> was his point - foreach with tuples looks like it is looping, 
> but really it is unpacking them statically at compile time.  
> And similarly with the recursive version.  I don't know if you 
> can avoid the mixin, but you can make it a little tidier.
>
> import std.math;
> import std.stdio;
> import std.traits;
>
> mixin template callThemAll(functions...)
> {
>    	mixin("alias 
> foo"~__traits(identifier,functions[0])~"="~__traits(identifier,functions[0])~";");
>     static if(functions.length >1)
>    		mixin callThemAll!(functions[1..$]);
> }
>
> void main()
> {
> 	mixin callThemAll!(sin,cos,tan);
> 	writefln("%s",foosin(1));
> 	writefln("%s",foocos(1));
> 	writefln("%s",footan(1.0));
> }
>
> Not sure if you knew this already and still found it too messy.

I had considered mixins as messy, but my original one was way 
messier than this. By comparison, it's not so bad.

Beyond the mixins, what I find most interesting was the 
__traits(identifier,functions[0]). Hadn't seen that before. I was 
only familiar with __FUNCTION__. It definitely simplifies it

Anyway, the downside of the approach so far is that I can't quite 
understand why some versions have worked, but not others. For 
your foo version (with a few modifications to better match what 
I'm doing), I was able to get it working regardless of whether it 
was in main or not. That's good. Further, when I got rid of the 
foo, but kept it in main, it still worked (after changing the 
function names). However, when I moved it back out of main I was 
getting messages about there being no cos/sin available for those 
types.

Note: some of the above seemed to only work when I kept the 
std.math.cos, std.math.sin text in there. When I take it out, I 
get warnings about recursive aliases. But, I can't seem to use a 
foreach loop. The recursive mixin template seems to be required.

So this is the last thing I did (that didn't work). Adding foo 
back to the alias works.

mixin template callThemAll(functions...)
{
    mixin("alias " ~__traits(identifier, functions[0]) ~
		  " = givemeabettername!(std.math."~__traits(identifier, 
functions[0]) ~ ");");
     static if(functions.length >1)
    		mixin callThemAll!(functions[1..$]);
}

mixin callThemAll!(cos, sin);


More information about the Digitalmars-d-learn mailing list