多相型ラムダ作ろうとして肝心なことに気付いてやめるまでのメモ書きそのまま公開
あと http://d.hatena.ne.jp/DigitalGhost/20090216/1234793120 は0引数のとき対応できない。だからポインタを作ってというのもあるのかも知れない…
ダミーパラメータで0とか付ければなんとかなるか…
あーそうか、typeof(a)とか型定義の中だとaが見えないからできない
CLOSURE_END のほうまでマクロの引数が伝わらない…ScopeExitが struct xxx { } x = struct yyy { ←ここまでSCOPE_EXIT ここからSCOPE_EXIT_END→ ~yyy() body };みたいな形になっていたのか…
構文とか
CLOSURE(cap, ret, n) (_1 x, _2 y) { ... } CLOSURE_END namespace closure { struct dummy_type {} dummy = {}; } struct closure_type_##UNIQUE_ID { ... closure_type_##UNIQUE_ID(..., int) : } name(..., closure::dummy);
問題
int a, b; int * p, * q; typeof(a) a; typeof(&b) &b; typeof(p) p; typeof(&q) &q;
typeof(&b) = typeof(p) になっている。あと型が元と違う。
関数挟んで変形してみる
int a, b; int * p, q; typeof(f(a)) typeof(f(&a)) typeof(f(p)) typeof(f(&p))
もうちょい
namespace closure { typedef void val_tag(int); typedef void ref_tag(int&); template<typename T, typename CaptureTag> struct capture_type; template<typename T> struct capture_type<T, val_tag> { typedef T type; }; template<typename T> struct capture_type<T*, ref_tag> { typedef T type; }; struct dummy {}; } int a, b; int * p, q; typedef typeof(a) capture_type_1_##unique_id; typedef typeof(&b) capture_type_2_##unique_id; typedef typeof(p) capture_type_3_##unique_id; typedef typeof(&q) capture_type_4_##unique_id; struct closure_##unique_id { typedef void capture_tag_1(int a); typedef void capture_tag_2(int &b); typedef void capture_tag_3(int p); typedef void capture_tag_4(int &q); capture_type<capture_type_1##unique_id, capture_tag_1>::type a; capture_type<capture_type_2##unique_id, capture_tag_2>::type &b; capture_type<capture_type_3##unique_id, capture_tag_3>::type p; capture_type<capture_type_4##unique_id, capture_tag_4>::type &q; template<PP_ENUM_PARAMS(...)> ret operator() params { ... } };
template<typename T> struct a { static size_t const value = 0; }; void f() { a<int*> b; // エラー b.x; } template<typename T> struct a<T*> { int x; }; int main() { a<int*> b; // エラー a<char*> c; b.x; c.x; }
あとで部分特殊化書いても、int*は既に実体化してるからエラーになる…ていうか後で特殊化書くのはいいのか?
そうか、ローカル型でテンプレートは使えないから多相型とか無理。死ぬ。