Understanding Safety of Function Pointers vs. Addresses of Functions
Laeeth Isharc via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Jul 12 19:52:09 PDT 2015
>> I don't know what exactly you're after, but you can use
>> foreach on a whatever-they're-called-now tuple (there's been a
>> discussion about the name which I haven't followed; I mean the
>> kind you get from a TemplateTupleParameter):
>> ----
>> void f1() {}
>> void f2() {}
>> void callThemAll(functions ...)()
>> {
>> foreach(f; functions) /* The loop is unrolled at compile
>> time. */
>> {
>> f();
>> }
>> }
>> void main()
>> {
>> callThemAll!(f1, f2)();
>> }
>> ----
>>
>> As usual, recursion is an alternative:
>> ----
>> void callThemAll(functions ...)()
>> {
>> static if(functions.length > 0)
>> {
>> functions[0]();
>> callThemAll!(functions[1 .. $])();
>> }
>> }
>> ----
>
> Sorry, I don't think I made myself clear enough. Your code
> allows you to do something like call multiple functions in a
> loop. I'm talking about the fact that
>
> alias cos = givemeabettername!(std.math.cos);
> alias sin = givemeabettername!(std.math.sin);
>
> are just two functions of many in std.math. Suppose I wanted to
> write it so that every function in std.math had an array
> version generated by this code. I would be repeating this alias
> line once each time. My point is that I don't see a way to do
> this in a loop. I don't think I can do something like
>
> void callThemAll(functions ...)()
> {
> foreach(f; functions)
> {
> alias __Function__ = givemeabettername!(f); //where
> __Function__ is the name of the function for f, not callThemAll
> }
> }
>
> callThemAll(std.math.cos, std.math.sin);
>
> void main()
> {
> real[] x = [0, PI];
> auto y = cos(x);
> auto z = sin(x);
> }
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.
More information about the Digitalmars-d-learn
mailing list