ちょっとだけクロージャを作ってみるのメモ

#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さんとこで書いてたあれも書けた。