Vâng, nó có thể
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");});
}
phiên bản với lập luận ủng hộ:
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:
cho hiệu suất tốt hơn bạn có thể sử dụng bí danh mẫu parametr cho hành động:
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, ví dụ thứ hai của bạn phải sử dụng 'foreach' khá hơn' for' và bạn thực sự có thể loại bỏ 'uint'. Một quy ước được sử dụng trong D cho vòng lặp lặp mà không cần tham chiếu trong vòng lặp là đặt tên cho chúng là '_'. Vì vậy, nó sẽ trở thành 'foreach (_; 0 .. N)' – yaz
Tôi thực sự khuyên bạn nên tải về các tài liệu tham khảo miễn phí và đọc nó. Tất cả điều này được trả lời khá sớm trong cuốn sách. Công trình đầu tiên của bạn. Thứ hai của bạn sẽ là _ trong 0..N {...}. Điều thứ ba là có thể, nhưng tôi không chắc liệu tiện ích mở rộng lần là bình thường hay không. Tôi biết có một ví dụ về chính xác điều đó trong các bài thuyết trình của WWDC, tôi nghĩ là tôi giới thiệu Swift. –