簡體   English   中英

按值捕獲成員變量

[英]capture member variable by value

使用C ++ 11 lambda表達式時,如何按值捕獲成員變量?

使用[my_member]語法似乎不起作用,隱式捕獲使用this指針。 需要的是一種明確指定成員變量的捕獲類型的方法。 那可能嗎?

我現在的解決方法是:

void member_function()
{
    std::shared_ptr<my_member_class> my_member_copy = my_member; // this shouldn't be necessary
    std::async([=]{ std::cout << *my_member_copy; });
    // std::async([=]{ std::cout << *my_member_; }); // wrong, my member could be potentially out of scope
}

我不認為你可以捕捉價值的一員,你可以捕捉this ,但因為成員是一部分this你將使用一個共享成員,而不是一個新的變量。

不知道你的成員是什么類型的東西應該工作:

auto copy = my_member;
std::async([copy]{ std::cout << copy; });

我不明白為什么你在你的例子中使用shared_ptr ,如果你想通過值捕獲肯定shared_ptr是你應該考慮的最后一件事。

不幸的是,我認為沒有直接的方法來做到這一點,但我可以想到幾種方法來捕獲一個成員而不需要額外的副本。

第一個選項與您的示例類似,但使用局部變量的引用:

void member_function()
{
   std::shared_ptr<my_member_class> &my_member_ref = my_member;
   // Copied by the lambda capture
   std::async([my_member_ref]{ std::cout << *my_member_ref; });
}

請注意,4.6.2版本的GCC中存在一個錯誤,導致該值無法復制。 請參閱在C ++ 0x lambda中通過復制捕獲引用變量

第二種方法是使用bind來制作副本:

void member_function()
{
   // Copied by std::bind
   std::async(std::bind([](const shared_ptr<my_member_class>& my_member){
      std::cout << *my_member; }, my_member));
}

在此示例中,bind將創建自己的my_member副本,然后通過引用將此副本傳遞給lambda表達式。

既然你的問題是關於C ++ 11,這不是一個真正的答案,但在C ++ 14中你可以這樣做:

void member_function()
{
    std::async([my_member=my_member]{ std::cout << *my_member; });
}

它與您自己的“解決方法”(如果my_member是shared_ptr)完全相同。

auto& copy = my_member;
std::async([copy]{ std::cout << copy; });

auto&(上面)也可以工作並避免復制兩次。 雖然這種方法比傳遞[this]更多的語法,但它避免了傳遞給閉包的對象[this]指向的依賴。

現在,我遇到了同樣的問題並自己解決了:

  1. 捕獲this指針。
  2. 然后在lambda中寫this->member語法:

那是,

 std::async([this]{ std::cout << this->my_member_; } ); 
 //          ^^^^                ^^^^^^ use this syntax
 //           | 
 //           ^
 //           capture `this` as well

這個對我有用。 我希望它也適合你。 但是,我對這方面的知識並不完全滿意。 在我的工作之后,我將查找需要此語法的原因,或者它是編譯器錯誤。 我正在使用GCC 4.5.0 (MinGW)。

好吧,我發現了以下主題,說明應該捕獲this指針以便使用該類的成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM