web-dev-qa-db-ja.com

C ++で2つのラムダ関数を追加する

2つのc ++ラムダ関数を追加しようとしています。それが私が意味することは次のとおりです:

2つの関数fgがあり、それぞれに1つ以上の引数があるとします。たとえば、f(x,y)g(x,y)としましょう。これらの両方を次のような新しい関数hに追加したいと思います。

h = f + g

そして、評価は次のように機能するはずです。

h(x,y) = f(x,y) + g(x,y)

これまでのところ、次のコードを試してみましたが、機能しません。末尾の「cin」は、コンソールが自動的に閉じないようにするためのものです。

#include <iostream>
#include <functional>

using namespace std;


function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
    return [&](int x, int y)->int{return g(x, y) + f(x, y); };
}


int main()
{
    int i = 0;

    function<int (int,int)> sum = [](int x, int y)->int { return x + y; };
    function<int (int,int)> mul = [](int x, int y)->int { return x * y; };
    cout << sum(1, 2) << endl;
    cout << mul(3, 4) << endl;

    function<int(int, int)> s = add(sum, mul);

    cout << s(2, 3) << endl;

    cin >> i;
}

コードはコンパイルされますが、s(2,3)を評価しようとすると機能しなくなります。それはただプログラムが機能しなくなったと私はそれを閉じなければならないと言います。 Visual Studio 2013を使用しています。

誰かがこれを正しく行う方法を知っていますか?または、これをすぐに実行できるライブラリを知っていますか?

14
pbit24

微妙です。

function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
    return [&](int x, int y)->int{return g(x, y) + f(x, y); };
         // ^-- This here
}

参照によってgおよびfをキャプチャし、それらの参照をstd::functionに格納して返します。しかし、これらは関数のローカル変数への参照であるため、2番目に戻るときにぶら下がります。したがって、コードの動作は未定義です。

簡単な修正は、値[=]でキャプチャすることです。