[英]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]指向的依賴。
現在,我遇到了同樣的問題並自己解決了:
this
指針。 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.