Ja, es möglich ist,
import std.stdio;
import std.traits;
void foo()
{
writeln("Do It!");
}
void times(T,N)(N n, T action) if (isCallable!T && isIntegral!N)
{
static if (ParameterTypeTuple!action.length == 1
&& isIntegral!(ParameterTypeTuple!action[0]))
foreach (i; 0 .. n)
action(i);
else
foreach (i; 0 .. n)
action();
}
void main(string[] args)
{
10.times(&foo);
10.times({writeln("Do It!");});
10.times((uint n){writeln(n + 1, " Round");});
}
Version mit Argumenten unterstützen:
import std.stdio;
import std.traits;
void foo()
{
writeln("Do It!");
}
struct Step {
alias n this;
size_t n;
this(size_t i)
{
n = i + 1;
}
}
struct Index {
alias n this;
size_t n;
}
void times(T,N,A...)(N n, T action, A args) if (isCallable!T && isIntegral!N)
{
alias PTTAction = ParameterTypeTuple!action;
static if (PTTAction.length >= 1)
{
alias FP = PTTAction[0];
static if (is(Index == FP) || is(Step == FP))
foreach (i; 0 .. n)
action(FP(i), args);
else
action(args);
}
else
foreach (i; 0 .. n)
action();
}
void main(string[] args)
{
10.times(&foo);
10.times({writeln("Do It!");});
10.times((Step n){writeln(n, " Step");});
10.times((Index n, string msg){writeln(n, msg);}, " Index");
stdin.readln;
}
UPDATE:
für eine bessere Leistung können Sie alias Vorlage parametr für Aktion verwenden:
void times(alias action,N)(N n) if (isCallable!action && isIntegral!N)
{
static if (ParameterTypeTuple!action.length == 1
&& isIntegral!(ParameterTypeTuple!action[0]))
foreach (i; 0 .. n)
action(i);
else
foreach (i; 0 .. n)
action();
}
void main(string[] args)
{
10.times!(foo);
10.times!({writeln("Do It!");});
10.times!((uint n){writeln(n + 1, " Round");});
}
Btw, Ihr zweites Beispiel muss 'verwenden foreach' anstatt' for' und man kann tatsächlich entfernen 'uint'. Eine Konvention, die in D für Loop-Iteratoren verwendet wird, die in der Schleife nicht referenziert werden müssen, ist, sie '_' zu nennen. So wird es 'foreach (_; 0 .. N)' – yaz
Ich würde wirklich empfehlen, die freie Referenz herunterzuladen und sie zu lesen. All dies wird in dem Buch ziemlich früh beantwortet. Deine ersten Arbeiten. Deine zweite wäre für _ in 0..N {...}. Die dritte ist möglich, aber ich bin mir nicht sicher, ob die Zeitverlängerung normal ist. Ich weiß, dass es ein Beispiel für genau das in den WWDC-Präsentationen gibt, denke ich. –