2017-08-03 16 views
15

Tôi có câu hỏi về việc chia một bộ tuple, như tiêu đề đã nói.Cách chia một bộ tuple bằng C++

Trong thực tế, tôi có thể làm điều đó bằng cách sử dụng std::index_sequence, nhưng mã trông xấu xí.

Có cách nào thanh lịch để hoàn thành việc này không?

Dưới đây là một số mã để hiển thị ý của tôi.

#include<tuple> 
using namespace std; 

template<typename THead, typename ...TTails> 
void foo(tuple<THead, TTails...> tpl) 
{ 
    tuple<THead> tpl_h { get<0>(tpl) }; 
    tuple<TTails...> tpl_t { /* an elegent way? */ } 
    do_sth(tpl_h, tpl_t); 
} 

int main() 
{ 
    foo(make_tuple(1, 2.0f, 'c')); 
    return 0; 
} 
+1

Một câu hỏi tương tự đã được hỏi trước: https://stackoverflow.com/questions/8569567/get-part-of-stdtuple nhưng câu trả lời C + 17 bằng cách nhìn ngắn gọn hơn. – Swift

+0

@Swift Cảm ơn bạn, tôi sẽ đi xem. – WangChu

Trả lời

8

Nếu bạn có một trình biên dịch C++ 17 có khả năng, bạn có thể sử dụng apply:

auto [tpl_h, tpl_t] = apply([](auto h, auto... t) { 
    return pair{tuple{h}, tuple{t...}}; 
}, tpl); 
do_sth(tpl_h, tpl_t); 

Example.

Vì bạn đang sử dụng VS2015.2, hỗ trợ C++ 14 và bản nháp sau n4567, bạn khá hạn chế trong hỗ trợ thư viện có sẵn. Tuy nhiên, bạn có thể sử dụng piecewise_construct:

struct unpacker { 
    tuple<THead> tpl_h; 
    tuple<TTails...> tpl_t; 
    unpacker(THead h, TTails... t) : tpl_h{h}, tpl_t{t...} {} 
}; 
auto unpacked = pair<unpacker, int>{piecewise_construct, tpl, tie()}.first; 
do_sth(unpacked.tpl_h, unpacked.tpl_t); 

Example.

+0

Cảm ơn bạn. Nhưng tôi đang sử dụng VS2015.2 (hỗ trợ C++ 14). Có một phương pháp mà tôi có thể sử dụng mà không cần thay thế trình biên dịch của tôi? – WangChu

+0

@WangChu: 'apply' có thể được triển khai trong C++ 14. – Jarod42

+0

@ Jarod42 Được rồi, tôi sẽ thử. – WangChu

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