Lambda abstractions in C++ vs. Schemeなるほどねー。これなら
1. Simple lambda-expressions
#define Lambda(args,ret_type,body) \
http://okmij.org/ftp/c++-digest/Lambda-CPP-more.html
class MakeName(__Lambda___) { \
public: ret_type operator() args { body; } }
Lambda((int a, int b), int, return a+b) foo;
std::cout << foo(1, 2) << std::endl; // 3
こんな書き方も出来る訳か。ただGUIなんかのコールバックだと関数ポインタが必要だし、operator()のアドレスなんて取る必要もないからstaticで宣言した関数ポインタで十分かな。fltkだとこんな感じにmainの外に関数宣言しなくても良くなるね。
/* g++ -I Develop/fltk c.cxx -L Develop/fltk/lib -lXi -lfltk2 -lXft -lXinerama -lXcursor */
#include <fltk/Window.h>
#include <fltk/Button.h>
#include <fltk/ask.h>
#include <fltk/run.h>
#include <stdlib.h>
int main(void) {
#define lambda(args,ret_type,block) \
class { public: static ret_type func args {block;} }
lambda((fltk::Widget* wid, void* data), void, fltk::alert("don't click!")) button_clicked;
fltk::Window w(0, 0, 300, 100, "lambda window");
w.begin();
fltk::Button b(10, 10, 280, 80, "click me!");
b.callback(&button_clicked.func, 0);
w.end();
w.show();
return fltk::run();
}
mainしか宣言したく無い人にはいいかも。
先日知ったんだけど、最近のVisual Studioに付いてるコンパイラだと
auto func [&](int a, int b) -> int { return a+b; };
std::cout << func(1, 2) << std::endl;
こんな書き方が出来るらしい。