...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

OddElements!(T) / EvenElements!(T)

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要素だけのタプルを与えると,空タプルを返します.