给定以下代码
import std.datetime: Clock, SysTime, Duration;
SysTime[] times;
const n = 3;
foreach (i; 0..n) times ~= Clock.currTime;
是否有更简单、可能更实用、更高阶的模式来实现相同的目标?
一个好处是,如果可能的话,可能通过一些就地构造模式来最小化元素的复制。
更新:
好的,到目前为止,这是我的尝试:
enum arityMin0(alias fun) = __traits(compiles, fun());
auto apply(alias fun, N)(N n) if (isCallable!fun &&
arityMin0!fun &&
!is(ReturnType!fun == void) &&
isIntegral!N)
{
import std.range: iota, map;
return n.iota.map!(n => fun);
}
例如,称为
import std.datetime: Clock;
auto times = 3.apply!(Clock.currTime).array;
还剩一个细节。限制
arity!fun == 0
评估false
为
auto times = 3.apply!(Clock.currTime).array;
因为这里的 arity 实际上是 0 和 1。
所以在这种情况下arity!fun
评估为1
,因为Clock.currTime
采用默认参数。
也许我们arityMin
也需要arityMax
。std.traits
在那种情况下我应该使用__traits(compiles
来实现arityMin
吗?