首頁 > 後端開發 > C++ > 如何在 C Lambda(C 11 和 C 14)中實現移動捕獲?

如何在 C Lambda(C 11 和 C 14)中實現移動捕獲?

Barbara Streisand
發布: 2024-12-17 20:56:12
原創
800 人瀏覽過

How Can I Achieve Move Capture in C   Lambdas (C  11 and C  14)?

C 11 Lambda 中的移動捕獲

C 14 中的廣義 Lambda 捕獲

C 14 引入了廣義 lambda 捕獲

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

// move the unique_ptr into the lambda
go.run( [ u = move(u) ] { do_something_with( u ); } ); 
登入後複製
C 14 引入了廣義 lambda 捕獲,支援移動捕獲。在C 14 中,類似以下的程式碼將是有效的:

go.run( [ u = move(u) ] mutable { do_something_with( std::move(u) ); } );
登入後複製
請注意,如果需要將物件從lambda 移動到另一個函數,則lambda 必須標記為可變:

C 11 中移動捕獲的解決方法

#include <cassert>
#include <memory>
#include <utility>

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

template<typename T> rref_impl<T> make_rref( T &amp;&amp; x )
{
    return rref_impl<T>{ std::move(x) };
}
登入後複製
在C 11中,可以使用輔助函數來實現移動捕獲make_rref 建立對所需值的右值參考:

int main()
{
    std::unique_ptr<int> p{new int(0)};
    auto rref = make_rref( std::move(p) );
    auto lambda =
        [rref]() mutable -> std::unique_ptr<int> { return rref.move(); };
    assert(  lambda() );
    assert( !lambda() );
}
登入後複製
使用make_rref 函數捕獲lambda 中的值:

請注意,此解決方法使lambda 可複製,這在捕獲不可複製的物件時可能會導致問題。

在 C 中模擬通用 Lambda 捕獲11

#include <utility>

template <typename T, typename F>
class capture_impl
{
    T x;
    F f;
public:
    // ... implementation
};

template <typename T, typename F>
capture_impl<T,F> capture( T &amp;&amp; x, F &amp;&amp; f )
{
    return capture_impl<T,F>(
        std::forward<T>(x), std::forward<F>(f) );
}
登入後複製
模擬廣義 lambda 捕獲的另一種方法涉及定義捕獲函數:

int main()
{
    std::unique_ptr<int> p{new int(0)};
    auto lambda = capture( std::move(p),
        []( std::unique_ptr<int> &amp; p ) { return std::move(p); } );
    assert(  lambda() );
    assert( !lambda() );
}
登入後複製
使用 capture透過移動捕獲值:

此解決方案提供一種更簡潔的方法,如果捕獲的類型不可複製,則禁用複製 lambda。

以上是如何在 C Lambda(C 11 和 C 14)中實現移動捕獲?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板