2009/10/29

Recent entries from same category

  1. RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  2. コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  3. C++ で flask ライクなウェブサーバ「clask」書いた。
  4. C++ 用 SQLite3 ORM 「sqlite_orm」が便利。
  5. zsh で PATH に相対パスを含んだ場合にコマンドが補完できないのは意図的かどうか。

C言語ってlambdaが書けないのでGUIのコールバックなんかを作る場合には関数を用意しなければならないのですが...
Lambda abstractions in C++ vs. Scheme

1. Simple lambda-expressions

#define Lambda(args,ret_type,body) \
class MakeName(__Lambda___) { \
public: ret_type operator() args { body; } }
http://okmij.org/ftp/c++-digest/Lambda-CPP-more.html
なるほどねー。これなら 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();
}

fltk-lambda-callback

mainしか宣言したく無い人にはいいかも。
先日知ったんだけど、最近のVisual Studioに付いてるコンパイラだと auto func [&](int a, int b) -> int { return a+b; };

std::cout << func(1, 2) << std::endl;
こんな書き方が出来るらしい
Posted at by | Edit