ちょっとだけクロージャを作ってみるのメモ
#include <iostream> #include <vector> #define CLOSURE_(A0) CLOSURE_DEF(##A0, __LINE__) #define CLOSURE_DEF(A0, id) CLOSURE_IMPL(A0, id) #define CLOSURE_IMPL(A0, id)\ struct Closure_##id {\ typedef decltype(A0) Arg0;\ Arg0& A0;\ Closure_##id(Arg0& a0) : A0(a0){} #define DEF_ operator() #define CLOSURE_EXIT_ } int main(int argc, char** argv) { int x = 5; CLOSURE_(x) int DEF_(int i) { return x + i; } CLOSURE_EXIT_ f(x); std::cout << f(5) << std::endl; std::vector<int> vi; CLOSURE_(vi) void DEF_(int i) { vi.push_back(i); } CLOSURE_EXIT_ push(vi); push(1); push(2); push(3); push(4); return 0; }
出力
10
C++03でも使えるようにするにはdecltypeのところを書き換えなきゃ。どうだったかな・・・。BOOST_TYPEOFの実装みるか。
あとf(x)ってxをCLOSURE_(x)とで2回書いてるのもダサい。どっちかだけにできないかなぁ。
追記:id:faith_and_braveさんとこで書いてたあれも書けた。