2015-11-08 17 views
7

std::tie cung cấp một cách thuận tiện để giải nén các nội dung của một tuple trong C++ vào biến được định nghĩa riêng biệt, giống như mẫu dưới đây minh họagiải nén các tuple lồng nhau trong C++

int a, b, c, d, e, f; 

auto tup1 = std::make_tuple(1, 2, 3); 
std::tie(a, b, c) = tup1; 

Tuy nhiên, nếu chúng ta có một tuple lồng nhau như dưới đây

auto tup2 = std::make_tuple(1, 2, 3, std::make_tuple(4, 5, 6)); 

cố gắng để biên dịch mã

std::tie(a, b, c, std::tie(d, e, f)) = tup2; 

không thành công có lỗi

/tmp/tuple.cpp:10: error: invalid initialization of non-const reference of type ‘std::tuple<int&, int&, int&>&’ from an rvalue of type ‘std::tuple<int&, int&, int&>’ 
    std::tie(a, b, c, std::tie(d, e, f)) = tup2; 
          ^

Có cách nào thành ngữ để giải nén một bộ tuple trong C++ không?

+0

Có thể trùng lặp http://stackoverflow.com/questions/21298732/can-we-do-deep-tie-with-a-c1y-stdtie-like-function –

+1

Bạn có thể tạo [tạm thời để làm tổ] (http://ideone.com/s3YLG9), mặc dù nó không phải là đẹp trai. – Cornstalks

Trả lời

4

Khi bạn biết rằng không có nguy cơ, bạn có thể chuyển đổi một tài liệu tham khảo rvalue đến một giá trị trái một thông qua chức năng helper sau:

template <class T> 
constexpr T &lvalue(T &&v) { 
    return v; 
} 

Sau đó, bạn có thể sử dụng nó thusly:

std::tie(a, b, c, lvalue(std::tie(d, e, f))) = tup2; 

Trong trường hợp của bạn, thực sự không có vấn đề gì khi làm điều đó, bởi vì bộ bên trong chỉ phải sống trong suốt thời gian của câu lệnh, và chính xác là trường hợp đó.

+0

Có thể xác định hàm tổng hợp 'ltie', trong đó gọi' ltie (a, b, c) 'tương đương với việc gọi' lvalue (std :: tie (a, b, c)) 'để đơn giản hóa mã thành 'ltie (a, b, c, ltie (d, e, f)) = tup2'; – dzhelil

+1

Thật không may nó không phải là. Nếu bạn chôn tuple tạm thời vào một hàm, thì nó sẽ là cục bộ cho hàm đó, và sẽ không sống đủ lâu. Thay vào đó, bạn có thể biến macro thành macro. – Quentin

+4

Hoặc chỉ sử dụng 'forward_as_tuple'. –

Các vấn đề liên quan