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