...ing logging 4.0

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

enumに対するforeach (2)

import std.stdio;
import std.typecons;
import std.typetuple;

template OddElements(T...)   // 省略
template EvenElements(T...)  // 省略

alias TypeTuple!(
	//要素定義 /  表示用テキスト
	"Read",       "読み込みモード",
	"Write",      "書き込みモード",
	"Append",     "追記モード"
) FileOpenModeDefinition;

alias OddElements!(FileOpenModeDefinition) FileOpenModeElements;
alias EvenElements!(FileOpenModeDefinition) FileOpenModeTexts;

mixin(defineEnum!("FileOpenMode", FileOpenModeElements));

void main()
{
	foreach (int index, string element; FileOpenModeElements)
	{
		FileOpenMode mode;
		enumFromString(element, mode);
		writeln(FileOpenModeTexts[index]);
	}
}

enumに対するforeachループの中で,enumの値がどれかによって決まるテキストを表示したかった.
配列を2つ作ってもできるけど,要素定義と表示用テキストが隣り合っていた方が何かと便利だった.
そこで,上のように1つの配列にして,要素定義と表示用テキストをそれぞれ取り出すメタ関数OddElements!(T)とEvenElements!(T)を作った.


それにしてもstd.typeconsは変態.