tie
絶対誰かが既に書いてそうな気がするboost::tieっぽい奴。
import std.bind : Tuple , tuple; import std.typetuple : TypeTuple; template add_pointer(T){alias T*add_pointer;} template map(alias F){alias TypeTuple!() map;} template map(alias F,T...){ alias TypeTuple!(F!(T[0]),map!(F,T[1..$])) map; } struct Tie(T...){ map!(add_pointer,T) value; void opAssign(Tuple!(T) value){*this = value.value;} void opAssign(T newValue){ foreach(i,v;newValue)*value[i]=v; } } Tie!(T) tie(T...)(inout T value){ Tie!(T) result; foreach(i,_;value)result.value[i] = &value[i]; return result; } void main(){ int x,y; tie(x,y) = tuple(100,20); printf("%d %d\n",x,y); tie(x,y) = TypeTuple!(y,x); printf("%d %d\n",x,y); tie(x,y) = tuple(y*10,x*10); printf("%d %d\n",x,y); }
いやーstd.bindって本当に便利ですね!
D言語で自分が最近一番使うライブラリです。