2017-01-02 17 views
6

Tôi có một lớp có chứa một tuple của loại biến như thế này:Làm thế nào để trích xuất một tập con của một bộ tuple trong một bộ dữ liệu mới?

template<class... Ts> 
struct Tester 
{ 
    std::tuple<Ts...> t; 

    template<class... T2s> 
    std::tuple<T2s...> Get() { ??? } 
}; 

Một instance ví dụ là Tester<int, float, char>

Tôi muốn chức năng Nhận của tôi trở lại chỉ là một tập hợp con của tuple trong. Ví dụ: tester.Get<int, char> sẽ trả lại một std::tuple<int, char> có giá trị được sao chép từ các thành viên thích hợp của bộ bên trong.

Bạn có thể giả định rằng mỗi loại xuất hiện tối đa một lần trong một bộ và Get sẽ chỉ được gọi với các thông số mẫu hợp lý nằm trong bộ dữ liệu.

Trả lời

8

Thực ra, điều này dễ hơn bạn nghĩ. std::get mất một loại, như là một thay thế cho các chỉ số thành viên tuple (vì C++ 14), và trả về kiểu phù hợp đầu tiên từ tuple:

#include <tuple> 
#include <iostream> 
#include <type_traits> 

template<class... Ts> 
struct Tester 
{ 
    std::tuple<Ts...> t; 

    template<class... T2s> 
    std::tuple<T2s...> Get() { 
     return std::tuple<T2s...> {std::get<T2s>(t)...}; 
    } 
}; 


int main() 
{ 
    Tester<int, char, float> t; 

    t.t=std::make_tuple(0,1,2); 

    auto result=t.Get<int, float>(); 

    std::cout << 
     std::is_same<decltype(result), std::tuple<int, float>>::value 
      << std::endl; 

    int &i=std::get<0>(result); 
    float &f=std::get<1>(result); 

    std::cout << i << " " << f << std::endl; 
    return 0; 
} 

Output, thử nghiệm với gcc 6.3.1:

1 
0 2 
+2

"Loại kết hợp đầu tiên" là gây hiểu lầm. Nếu loại xảy ra nhiều lần, chương trình sẽ bị hỏng. –

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