謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

プリプロセッサ最強説

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);
}

何か激しく勘違いしてる気もするが頭痛してて内容が全然頭に入ってこないので後でちゃんと読んでみる。