Perlの代替として(8)

テンプレート

Perlは型付けがないので関係ないが、
D言語ではテンプレートが使える。


T max(T)(T a, T b) {
return a > b ? a : b;
}

C++と比べるとずいぶん簡単な記述だ。
C++だとこうかな?(試していない)


template
T max(T a, T b) {
return a > b ? a : b;
}

これでいろんな型に使える。


dout.writefln(max(2, 3)); // 3

クラスでも使える。


class cData {
int value;
this(int a) {
value = a;
}
int opCmp(Object o) {
cData d = cast(cData)o;
return value - d.value;
}
}

cData a = new cData(2);
cData b = new cData(3);
dout.writefln(max(a, b).value); // 3


前に書いていた、順位をつける問題は次のようになった。



import std.cstream;

void main(char[][] arg) {
class cData {
int label, value, rank;
this(int a, int b) {
label = a;
value = b;
}
}

auto a = [ 3, 11, 2 ];
cData [] b;
b.length = a.length;
for(int i = 0; i < a.length; i++) {
b[i] = new cData(i, a[i]);
}

sort(b, (cData a, cData b) { return a.value - b.value; } );
for(int i = 0; i < b.length; i++) { b[i].rank = i + 1; }
sort(b, (cData a, cData b) { return a.label - b.label; } );

foreach(d; b) {
dout.writefln("%2d. %2d", d.rank, d.value);
}
}

void sort(T)(T [] ary, int delegate(T, T) f) {
void swap(int i, int k) {
T tmp = ary[i]; ary[i] = ary[k]; ary[k] = tmp;
}
for(int i = 0; i < ary.length - 1; i++) {
int min = i;
for(int k = i + 1; k < ary.length; k++) {
if(f(ary[min], ary[k]) > 0)
min = k;
}
swap(i, min);
}
}