プリプロセッサ最強説
boost::preprocessor見てそんなふうに思った。エラーとかは不自由そうだけどtemplateが万能ではないことが良くわかる。
それとc++0xは個人的に期待外れになりそうな感じ。
c++0xのwhereってtemplateにprivateを付けられるようにすれば解決す…しないのか。こういう時も不便だわなプリプロセッサって。
conceptは…型の型って言われてもそれは派生元の型でなくて?って感じだなぁ。
class Base(T){ } class Test:Base!(float){ }
を
void func(T)(Base!(T) a){ }
というふうにすればいいんだし、この場合のTを推論できるようにすればさらに良い気ガス。(構文はD言語。D言語ではこのTを推論してくれない)
後はtemplateを使ったコンスタントな演算のオーバーライドの構文を作ればいいだけだと思う。
とりあえず書いてみた。バグにぶつかった。インスタンスのtemplateでもstatic扱いだから可能なはずなんだけど…って派生の問題があるから無理か。エラーメッセージが出ないのは多分バグ。んで色々変えてったらコンパイラが落ちた。templateの引数にクラスはまだ使えないせい。
private import std.stdio; template Base(T){ alias int dummy;//hack class Base(T u){ const T id=u; template cmp(V){ alias int dummy;//hack template cmp(V w){ alias int dummy;//hack template cmp(.Base!(V).Base!(w) j){ const bool cmp=cast(bool)(id==j); } } } } } class Test:Base!(int).Base!(1){} class Test2:Base!(int).Base!(1){} class Test3:Base!(int).Base!(2){} template func(T){ alias int dummy;//hack void func(T u)(Base!(T).Base!(u) a){ Test2 b=new Test2; Test3 c=new Test3; // writefln(a.cmp!(b));//I want to write like this // writefln(a.cmp!(c)); writefln(Base!(T).Base!(u).cmp!(int).cmp!(1).cmp!(b));//ok writefln(Base!(T).Base!(u).cmp!(int).cmp!(2).cmp!(c));//ok writefln(a.cmp!(int).cmp!(1).cmp!(b));//ok? writefln(b.cmp!(int).cmp!(2).cmp!(c));//failed } } void main(){ Test t=new Test; // func(t);//I want to write like this func!(int).func!(1)(t); }
何か激しく勘違いしてる気もするが頭痛してて内容が全然頭に入ってこないので後でちゃんと読んでみる。