ホームページ >バックエンド開発 >C++ >C のラムダ式で移動してオブジェクトを効率的にキャプチャするにはどうすればよいですか?

C のラムダ式で移動してオブジェクトを効率的にキャプチャするにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-09 07:19:07719ブラウズ

How Can I Efficiently Capture Objects by Move in C   Lambda Expressions?

ラムダ式の移動キャプチャ

はじめに

C では、右辺値参照とも呼ばれる移動によるキャプチャを使用すると、オブジェクトの所有権をラムダ式に効率的に転送します。この手法は、オブジェクトのリソースをラムダ内で明示的に管理する必要がある状況で特に役立ちます。

C 14 の一般化されたラムダ キャプチャ

C 14 では、一般化されたラムダ キャプチャが洗練されたソリューションを提供します。ムーブキャプチャ用。この機能を使用すると、移動セマンティクスを使用して値によって変数を取得するラムダ式を宣言できます。

using namespace std;

auto u = make_unique<some_type>(some, parameters);  

go.run([u = move(u)] { do_something_with(u); });

このアプローチでは、u の所有権をラムダに移動し、リソースが適切に解放されるようにします。さらに、オブジェクトをラムダから移動する必要がある場合は、ラムダを可変として宣言する必要があります。

C 11 での移動キャプチャの回避策

C 11 では、移動キャプチャは直接実行されません。サポートされました。ただし、この動作をエミュレートできる技術があります。 1 つのアプローチは、ヘルパー関数を使用して右辺値参照 (rref) を作成することです:

template <typename T>
struct rref_impl {
    rref_impl() = delete;
    rref_impl(T &&x) : x(std::move(x)) {}
    // ... (remaining implementation)
};

template<typename T> rref_impl<T> make_rref(T &&x) {
    return rref_impl<T>{std::move(x)};
}

このヘルパー関数を使用すると、ラムダ内で移動することでオブジェクトをキャプチャできます:

unique_ptr<int> p{new int(0)};
auto rref = make_rref(std::move(p));
auto lambda = [rref]() mutable -> unique_ptr<int> { return rref.move(); };

取得した右辺値参照を変更できるように、ラムダは可変として宣言されていることに注意してください。

エミュレーションC 11 の一般化ラムダ キャプチャ

C 11 で一般化ラムダ キャプチャをエミュレートするもう 1 つのアプローチは、カスタム クラスを使用して変数をキャプチャし、それをラムダの外に移動する方法を提供することです。

template <typename T, typename F>
struct capture_impl {
    T x;
    F f;
    // ... (remaining implementation)
};

template <typename T, typename F>
capture_impl<T,F> capture(T &&x, F &&f) {
    return capture_impl<T,F>(std::forward<T>(x), std::forward<F>(f));
}

このクラスを使用すると、移動によって変数をキャプチャし、 lambda:

unique_ptr<int> p{new int(0)};
auto lambda = capture(std::move(p), [](unique_ptr<int> &p) { return std::move(p); });

前のアプローチとは異なり、キャプチャされた型がコピー可能でない場合、このラムダはコピーできません。これにより、ラムダをコピーする際の潜在的なエラーが防止されます。

以上がC のラムダ式で移動してオブジェクトを効率的にキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。