Merhaba,
İşte ben buna iş birliği derim çünkü yabancı biri işaret edip Ali hocanın çözüm bulması ve onun geliştirmesi ile şahane bir şey şurada açığa çıktı:
import std.meta;
template statikMap(size_t N, alias fun, args...)
if(args.length % N == 0) {
alias statikMap = AliasSeq!();
static foreach (i; 0..args.length / N) {
static if (N == 1) {
statikMap = AliasSeq!(statikMap, fun!(
args[i]
));
} else static if (N == 2) {
statikMap = AliasSeq!(statikMap, fun!(
args[0..$ / N][i],
args[$ / N..($ / N) * 2][i]
));
} else static if (N == 3) {
statikMap = AliasSeq!(statikMap, fun!(
args[0..$ / N][i],
args[$ / N..($ / N) * 2][i],
args[($ / N) * 2..($ / N) * 3][i]
));
}
}
}
alias T = AliasSeq!(byte, short, int);
alias V = AliasSeq!(1, 2, 4);
alias B = AliasSeq!("8 bit", "16 bit", "32 bit");
void main()
{
struct Birli(T)
{
T data;
}
struct İkili(T, size_t s)
{
T[s] data;
}
struct Kimlikli(T, size_t s, string str)
{
T[s] data;
enum id = str;
}
statikMap!(1, Birli, T) values;
assert(is(typeof(values[0].data) == byte));
assert(is(typeof(values[1].data) == short));
assert(is(typeof(values[2].data) == int));
statikMap!(2, İkili, T, V) arrays;
assert(arrays[0].data.length == 1);
assert(arrays[1].data.length == 2);
assert(arrays[2].data.length == 4);
statikMap!(3, Kimlikli, T, V, B) kimlikliDizi;
import std.stdio;
with(kimlikliDizi[0]) id.writeln(" x ", data.length);
with(kimlikliDizi[1]) id.writeln(" x ", data.length);
with(kimlikliDizi[2]) id.writeln(" x ", data.length);
}/* ÇIKTISI:
dmd -run "staticMap123.d" (in directory: /home/user/Documents/Ddili/sdb)
8 bit x 1
16 bit x 2
32 bit x 4
*/
Kaydedin bir köşeye! Özellikle de nitelikli (kimlikli) olan yani üçlüsü şahane. Bilmem soruyu soran için 4'lü 5'li ne gerek var dedirtiyor ama Tuple ve kendi türlerimiz ile yapılan harika bir olanak.
Başarılar...