プログラミング生放送#10@品川 おつかれさんっしたー
プロ生デビューしたはいいがいかんせんオーディエンスの傾向が掴めず、
まずは無難にC++11の新機能紹介がてら
「C++からポインタを廃する/安全に使う」ためのTipsとか話してみたり。
で、懇親会で訊かれた:
「lambdaを返す関数って書けるの?」
その場ではアドリブでちょろちょろっと書いてみせたけど、
帰りの電車内、酒の抜けかけた頭ですこしばかり考えてみたです。
たとえば「引数をふたつとるlamda式 f と引数 a を与えると g(x) = f(x,a) となるlambda式 g を返す」
ってゆー関数 bind_second が書けるんやろか。ちょっとやってみるね。
#include <functional>
template<typename Arg1, typename Arg2, typename Result>
std::function<Result(Arg1)>
bind_second(std::function<Result(Arg1,Arg2)> f, Arg2 arg2)
{
return [=](Arg1 arg1) { return f(arg1,arg2); };
}
#include <iostream>
using namespace std;
int main() {
function<int(int,int)> plus = [](int x, int y) { return x + y; };
function<int(int,int)> multiplies = [](int x, int y) { return x * y; };
auto incr = bind_second(plus,1); // +1する
auto twice = bind_second(multiplies,2); // 2倍する
cout << incr(3) << ' ' << twice(3) << endl;
}
おぉ、できるぢゃん♪