2017-09-16 128 views
0

我試圖找出一種方法來捕獲一個可以由l和r值引用組成的可變數據包,並通過引用捕獲l值來捕獲r值,供以後使用(因此異步測試)。我嘗試了以下操作:複雜的元組捕獲

#include <iostream> 
#include <tuple> 
#include <future> 

template<typename... T> 
auto bar(T&&... values) 
{ 
    return [tup = std::forward_as_tuple(values...)](){ 
     std::cout << std::get<0>(tup) << std::endl; 
    }; 
} 

int lValue = 50; 

int main() 
{ 
    auto rvalues = bar(50); 
    auto lvalues = bar(lValue); 

    auto futureR(std::async(rvalues)); 
    auto futureL(std::async(lvalues)); 
    futureR.get(); 
    futureL.get(); 
    return 0; 
} 

但是,當執行rvalues lambda時會輸出一個未定義的值。左值lambda輸出所需的50而不需要複製構造(可能與大對象一起使用)。有沒有一種方法可以通過值來捕獲r值,而不需要複製構造通過l值引用傳遞的對象而不知道我將得到的l和r值的組合類型?

auto mixedValues = bar(50, lValue); 
auto futureMixed(std::async(mixedValues)); 

鏈接到例如外殼http://cpp.sh/336lv

回答

3

在:

template<typename... T> 
auto bar(T&&... values) 
{ 
    return [tup = std::forward_as_tuple(values...)](){ 
     std::cout << std::get<0>(tup) << std::endl; 
    }; 
} 

得益於參考壓扁魔法,T爲是左值參數左值引用類型,和非參考鍵入rvalues的參數。爲此,您需要:

return [tup = std::tuple<T...>(std::forward<T>(values)...)](){ 
    std::cout << std::get<0>(tup) << std::endl; 
}; 

存儲左值按值引用和右值。

+0

是的!這就是我所需要的,真棒,我害怕我需要一些大的醜陋元函數來將l值類型改回l值引用或其他東西,當你必須捕獲到lambda時,這些東西會變得非常混亂.... –