7

ラムダをC#で大量に使用した後、C++でラムダを操作しようとしています。私は現在ブーストタプルを持っています(これは本当に単純化されたバージョンです)。

typedef shared_ptr<Foo> (*StringFooCreator)(std::string, int, bool)
typedef tuple<StringFooCreator> FooTuple

次に、グローバル名前空間の関数をFooTupleにロードします。理想的には、これをラムダに置き換えたいと思います。

tuplearray[i] = FooTuple([](string bar, int rc, bool eom) -> {return shared_ptr<Foo>(new Foo(bar, rc, eom));});

ラムダタプルの関数シグネチャがどうあるべきかわかりません。明らかに関数ポインタではありませんが、ラムダのシグネチャがどうあるべきか理解できません。現在、ラムダのリソースはすべてかなり薄いです。現在、C ++ 0xが流動的であることに気づきましたが、これを機能させる方法に興味がありました。これを行うにはもっと簡単な方法があることもわかっていますが、私はC++0xで遊んでいます。Intel11.1コンパイラを使用しています。

4

3 に答える 3

7

演算子はラムダの戻り型を設定します。->戻り型がない場合は省略できます。また、コンパイラーが推測できる場合は、戻り型を省略できます。テリーが言ったように、ラムダを関数ポインターに割り当てることはできません(GCCはこの変換を不適切に許可します)が、std::functionを使用することはできます。

このコードはGCCとVC10で機能します(VCのインクルードからtr1 /を削除します)。

#include <tr1/tuple>
#include <tr1/functional>
#include <tr1/memory>

using namespace std;
using namespace std::tr1;

class Foo{};
typedef function<shared_ptr<Foo>(string, int, bool)> StringFooCreator;
typedef tuple<StringFooCreator> FooTuple;

int main() {
    FooTuple f(
        [](string bar, int rc, bool eom) {
            return make_shared<Foo>();
        }
    );

    shared_ptr<Foo> pf = get<0>(f)("blah", 3, true);
}
于 2009-12-24T19:20:39.100 に答える
3

VisualC++ブログから

ラムダをtr1::functionsに格納することについて説明しました。ただし、tr1 :: functionにはオーバーヘッドがあるため、必要な場合を除いて、これを行うべきではありません。ラムダを再利用したい場合、または単に名前を付けたい場合は、autoを使用できます。

于 2009-12-25T07:49:33.397 に答える
1

std::functionにラムダを格納できるはずです。あなたの例では、それをに保存してみてください

std::function<std::shared_ptr<Foo>(std::string,int,bool)>

自動を忘れないでください(ただし、自動の配列などを作成することはできません)。

于 2009-12-24T19:20:46.663 に答える