naryFun

このテンプレートは、$(M std.functional.unaryFun)や$(M std.functional.binaryFun)を一般化し、 N個の引数を取れるようにしたものです。 $(M unaryFun)や$(M binaryFun)のように文字列に対して作用する場合は、その文字列で表される関数となります。 対して、文字列以外を$(M naryFun)に適用した場合には、その対象へのaliasとなります。

文字列による形式には、現在のところアルファベット及び数字に対応しています。

template naryFun(alias fun, int N = -1)
ref
naryFun
(
T...
)
(
auto ref T args
)
if (
!(N >= 0) ||
T.length == N
)
if (
is(typeof(fun) == string)
)

Examples

1 alias test1 = naryFun!"a";
2 assert(test1(1) == 1);
3 assert(test1(test1(2.0)) == 2.0);
4 static assert(is(typeof({test1(1, 1);})));  // OK
5                                             // 最初の引数を返す関数だから。
6                                             // 2つ目の引数は使用されない。
7 
8 static assert(!is(typeof({test1();})));     // NG
9 
10 
11 alias test1_1 = naryFun!("a", 1);       // 引数の数を1つとする
12 assert(test1_1(1) == 1);
13 assert(test1_1(test1(2.0)) == 2.0);
14 static assert(!is(typeof({test1_1(1, 1);})));  // NG
15 
16 
17 alias test1_2 = naryFun!("a", 2);       // 引数の数を2つとする
18 assert(test1_2(1, 1) == 1);
19 assert(test1_2(test1_2(2.0, 2), 1) == 2.0);
20 static assert(!is(typeof({test1_2(1);})));  // NG
21 
22 
23 alias test2 = naryFun!"b";
24 assert(test2(1, 2) == 2);
25 assert(test2(test2(1, "2"), test2(3.0, '4')) == '4');
26 static assert(!is(typeof({test2();})));
27 static assert(!is(typeof({test2(1);})));
28 static assert(is(typeof({test2(1, 1, 2.2);})));
29 
30 
31 // アルファベット
32 alias test3 = naryFun!"a + b + c";
33 assert(test3(1, 2, 3) == 6);
34 
35 import std.bigint;
36 assert(test3(BigInt(1), 2, 3) == BigInt(6));
37 
38 
39 // 数字
40 alias test4 = naryFun!"_0 + _1 + _2 + _3";
41 assert(test4(1, 2, 3, 4) == 10);

Meta