2013-06-04 22 views
13

Tôi muốn tạo một mẫu nơi tôi có thể nhập chỉ mục và nó sẽ cho tôi loại ở chỉ mục đó. Tôi biết tôi có thể làm điều này với decltype(std::get<N>(tup)) nhưng tôi muốn thực hiện điều này bản thân mình. Ví dụ, tôi muốn làm điều này,Làm cách nào để lấy loại N-th từ một bộ tuple?

typename get<N, std::tuple<int, bool, std::string>>::type; 

... và nó sẽ cung cấp cho tôi những loại ở vị trí N - 1 (vì mảng lập chỉ mục bắt đầu từ 0). Tôi có thể làm cái này như thế nào? Cảm ơn.

+0

Với sự tôn trọng câu trả lời tốt 0x499602D2, tôi nghĩ rằng bạn nên chấp nhận câu trả lời cho thấy đặc điểm tiêu chuẩn thư viện. Hãy xem xét làm như vậy. – einpoklum

Trả lời

12

Bạn có thể sử dụng mẫu lớp và chuyên môn từng phần để thực hiện những gì bạn muốn. (Lưu ý rằng std::tuple_element làm gần như giống như câu trả lời khác nói):

#include <tuple> 
#include <type_traits> 

template <int N, typename... Ts> 
struct get; 

template <int N, typename T, typename... Ts> 
struct get<N, std::tuple<T, Ts...>> 
{ 
    using type = typename get<N - 1, std::tuple<Ts...>>::type; 
}; 

template <typename T, typename... Ts> 
struct get<0, std::tuple<T, Ts...>> 
{ 
    using type = T; 
}; 

int main() 
{ 
    using var = std::tuple<int, bool, std::string>; 
    using type = get<2, var>::type; 

    static_assert(std::is_same<type, std::string>::value, ""); // works 
} 
+0

@ user1131467 nó chỉ là cách tôi quyết định làm điều đó – 0x499602D2

10

Tính trạng đó đã tồn tại và được gọi là std::tuple_element.

Dưới đây là live example minh họa cách sử dụng của nó.

+1

Nhưng tôi đã nói tôi muốn tự mình thực hiện điều này. :) – user2030677

+0

Cho rằng * "Tôi biết tôi có thể làm điều này nhưng tôi muốn tự mình thực hiện điều này." *, Đây không phải là câu trả lời mà là một bình luận (mặc dù hữu ích, vì OP dường như không biết gì về ' std :: tuple_element'). –

+0

@ user2030677: Tôi xin lỗi, tôi nên đọc nội dung của câu hỏi tốt hơn - Tôi đã bỏ qua phần đó :) –

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