読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

ジェネリックなラムダ

An implementation of generic lambdas (request for feedback)—Faisal Vali - Standard C++
ジェネリックラムダは C++1y でどうなるか。期待大ですね。

auto Sum = [](auto a, decltype(a) b) { return a + b; };
int i = Sum(3, 4);
double d = Sum(3.14, 2.77);

auto でジェネリックな型を表現。int でも double でもおk。

auto NumElements = []<int N>(auto (&a)[N]) { return N; };
int arri[]{1, 2, 3};
double arrd[]{3.14, 2.77, 6.626};
auto total = NumElements(arri) + NumElements(arrd);

おなじみの < と > で囲んだテンプレートも使えたり。ここでは配列の要素数 N を返すラムダを定義してます。

int local = 10;
auto L = [&](auto a) a + ++local;

ラムダの本体(body)に直接式を書いちゃうパターン。 { } とか return とか不要だと短くすっきり書けますね。

auto L = [](auto a, decltype(a) b) { return a + b; };
int (*fp)(int, int) = L;

なんとキャプチャしないラムダは関数へのポインタへ変換できたり。個人的にはびっくり。auto を int と推論してくれるパターンですね。
C++1y が今から待ちどおしいです。