2

restrict(amp)次のように関数を作成できます。

auto f = [](int& item) restrict(amp) {item += 1;};

そして、この関数を他のrestrict(amp)関数で使用できます。たとえば、次のようになります。

concurrency::parallel_for_each(av.extent,
    [=](concurrency::index<1> idx) restrict(amp) 
    { 
      f(av[idx]); 
    }
);

autoコンパイル後に " " の代わりに代入されるのはどのタイプですか? 「std::function」を使用しようとしました:

std::function<void (int&) restrict(amp)> f
           = [](int& item) restrict(amp) {item += 1;};

コンパイルエラーを受け取りました。

ご清聴ありがとうございました!

4

1 に答える 1

5

ラムダ式の結果はクロージャオブジェクトであり、クロージャオブジェクトのタイプは不明です。正確なタイプの変数を宣言するためにのみ使用できます。auto

ただし、クロージャオブジェクトをの適切なインスタンスに変換std::functionできます。ラムダが非キャプチャの場合は、関数ポインタに変換することもできます。ただし、この変換には(かなりの)コストがかかるauto可能性があるため、実際のクロージャタイプを処理するために可能な限り使用することをお勧めします。

式についても同じことがbind言えます。

関連する標準セクションは5.1.2(3)です。

ラムダ式の型(クロージャオブジェクトの型でもあります)は、一意の名前のない非ユニオンクラス型(クロージャ型と呼ばれます)であり、そのプロパティについて以下で説明します。このクラスタイプは集合体ではありません。

とはいえ、このコンテキストで特別なAMP拡張機能がどのように動作するかはわかりません。また、AMP制限ラムダは他のものに変換できないと考えられます。これをAMP仕様で調べてみます。

更新:AMP仕様のセクション2.2.3および2.3がこの質問に当てはまるようです。

于 2012-05-07T10:28:23.413 に答える