import std.typetuple; template OddElements(T...) { static if (T.length == 0) { alias TypeTuple!() OddElements; } else static if (T.length <= 2) { alias TypeTuple!(T[0]) OddElements; } else { alias TypeTuple!(T[0], OddElements!(T[2..$])) OddElements; } } template EvenElements(T...) { static if (T.length <= 1) { alias TypeTuple!() EvenElements; } else { alias TypeTuple!(T[1], EvenElements!(T[2..$])) EvenElements; } } unittest { static assert(OddElements!().length == 0); static assert(EvenElements!().length == 0); static assert(OddElements!("1").length == 1); static assert(EvenElements!("1").length == 0); alias TypeTuple!("1","2","3","4","5") TList; alias OddElements!TList t1; static assert(staticIndexOf!("1", t1) == 0); static assert(staticIndexOf!("3", t1) == 1); static assert(staticIndexOf!("5", t1) == 2); alias EvenElements!TList t2; static assert(staticIndexOf!("2", t2) == 0); static assert(staticIndexOf!("4", t2) == 1); }
OddElementsは奇数番目のタプルだけを返すメタ関数です.
EvenElementsは偶数番目のタプルだけを返すメタ関数です.
空タプルを与えると,どちらも空タプルを返します.
EvenElementsに1要素だけのタプルを与えると,空タプルを返します.