個人的タプルのまとめ
- 式/型タプルのforeachはコンパイル時に評価される。ただし、関数の中でないと使えない(多分バグ)。
- 式タプルはようは変数のタプルである。ただし、別のテンプレートに渡すとスライスが出来ない(多分バグ)。
って事でこんなコードも通る。(prefixを複数にしたいならprefixをchar[ ][ ]にすればいいけど、static foreachが無いからその先がどうしようも無い。char[ ]以外にも出来るようにしたいけどネストテンプレートで色々バグがあるので出来ない。)
private import std.typetuple,std.stdio; interface Base{ char[] getPrefix(); } class Foo:Base{ const char[] prefix = "foo"; char[] getPrefix(){ return prefix; } } class Bar:Base{ const char[] prefix = "bar"; char[] getPrefix(){ return prefix; } } Base getClass(T...)(char[] prefix){ switch (prefix){ foreach (U; T){ case U.prefix: return new U; } default: } return null; } void main(char[][] args){ if(args.length < 2)return 1; Base a = getClass!(Foo,Bar)(args[1]); if(!a)return 1; writefln(a.getPrefix); }
こんなコードも通る。(この例はpiano曲線さんのをベース)
import std.typetuple,std.stdio; template CopyTuple(Values...) { void to(Types...)(inout Types lhs){ // lhs[0..$] = Values[0..$];//lvalueに出来ない foreach(i, V;Values){ // lhs[i] = V;//文字列が壊れる lhs[i] = Values[i]; } } }
こんなコードも通る。
import std.stdio; void main(){ int a=0,b=5,c=1; alias Test2!(a,b,c) tup; writefln(tup); }
まだバグだらけだわな。色々遊ぼうとしたけど結構無理だった。