No Such Blog or Diary
gcc 4.5.0 (experimental) でラムダ式を返す関数を作ろうとしたが…
下のようにdecltypeの中にλ式を書いたらコンパイル通らなかった.うーん,expressionなら何でもよいと思ったのだが何か間違っただろうか?
#include <iostream> template <typename T> auto func(T i) -> decltype(i) { return i; } template <typename T> auto func1(T i) -> decltype([=](int j){ return i+j; }) { return [=](int j){ return i+j; }; } int main(int argc, char *argv[]) { func(1); func1(1); return 0; }
上側のfuncの定義は通る.でも下のfunc1の定義が通らない.expected primary-expression before ')' token (λ式の後の)の手前に式が必要)とか言われる.
そしてλ式とテンプレートの同時使用の仕方が分からない.ポリモーフィックなλ式は作れるのか?
- Comments: 0
- TrackBack (Close): -
gcc 4.5.0 (experimental) でラムダ式をデマングルしてみた
#include <iostream> #include <typeinfo> #include <cxxabi.h> int main(int argc, char *argv[]) { auto f = [](int a) { return (a + 1) ^ 7;}; int status; std::cout << abi::__cxa_demangle((typeid (f)).name(), 0, 0, &status) << std::endl; auto g = [](int a, float b) { return ((a + 1) ^ 7) + b;}; std::cout << abi::__cxa_demangle((typeid (g)).name(), 0, 0, &status) << std::endl; auto h = [](int a, float b) { return ((a + 1) ^ 7) + b;}; std::cout << abi::__cxa_demangle((typeid (h)).name(), 0, 0, &status) << std::endl; std::cout << abi::__cxa_demangle((typeid (h(1,1.0f))).name(), 0, 0, &status) << std::endl; return 0; }
を実行して
main::{lambda(int)#1}
main::{lambda(int, float)#2}
main::{lambda(int, float)#3}
float
が出力された.
とりあえず,宣言された場所+lambdaに引数が連なって,ついでに何番目に宣言されたかがくっつくと.なるほど.
- Comments: 0
- TrackBack (Close): -
来月の買い物予定:N-02B
- 2009-11-12 (Thu)
- 一般
いい加減今持ってる携帯(N905i)がボロボロなので,来月出る予定のN-02Bの購入しようかなと.キャッチコピーの「瞬撮」とかどうでもいいんだけど,ニューロポインターと回転二軸折り畳みの筐体にWLANとタッチパネルがつくという理想状態になってくれたのは有難い.あとは実機で動きがもっさりしなければ購入確定なのだが…
- Comments: 0
- TrackBack (Close): -
gcc 4.5.0 (experimental) でラムダ式使ってみた
- 2009-11-11 (Wed)
- プログラミング
gccのsvnにある4.5.0ならc++0xのλ式が使えるのでgccをコンパイルしてインストールしてみた.
とりあえず std::transform を一行でかけるのかなぁと以下のコードを書いてコンパイル.オプションに -std=gnu++0xを指定.
#include <iostream> #include <algorithm> #include <vector> int main(int argc, char *argv[]) { std::vector<int> x; int n = 10; for(int i = 0; i < n; i++) x.push_back(i); for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it); std::cout << std::endl; std::transform(x.begin(), x.end(), x.begin(), [](int a) { return (a + 1) ^ 7;}); for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it); std::cout << std::endl; return 0; }
そしたら普通にコンパイルが通って,実行したら配列要素がちゃんとインクリメントされていた.
ちなみに,上のプログラムのtransformのメインループは
L42:
movl (%rax), %edx
addq $1, %rcx
addl $1, %edx
xorl $7, %edx
movl %edx, (%rax)
addq $4, %rax
cmpq %rcx, %rbx
ja L42
のようにコンパイルされた(-O3 オプションで).λ式だと変なオーバーヘッドが入らないらしい.boostのlambdaないしfunctionsあたりだと変なオーベーヘッドが掛かってたけど,c++0xのλ式だとその心配がなく簡単に使える.ただし,このλ式を変数に代入したりしたときにどうなるかはまだ試してない.
- Comments: 0
- TrackBack (Close): -
こんなこともあろうかと
- 2009-11-10 (Tue)
- 一般
セミナーの欠席者が出ても良いようにとプレゼンの用意をしておいた.とはいえ比較実験が追いついていないので内容的にもあまり新しくなかったのだが…
さて,とりあえずc++0xのラムダを試そうかね.gccも4.5.Xでラムダが使えるみたいだし(4.4.Xでも使えるとか言われたがいろいろ見る限りでは不可能にしか見えない).
- Comments: 0
- TrackBack (Close): -