2017-01-02 13 views
6

Mam klasy, który zawiera krotki typów zmiennych, takich jak ten:Jak wyodrębnić podzbiór krotki w nowej krotce?

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

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

Przykładem instancji jest Tester<int, float, char>

Chcę dostać się do mojego funkcja zwraca tylko podzbiór wewnętrznej krotki. Na przykład: tester.Get<int, char> zwróci wartość std::tuple<int, char>, której wartości zostaną skopiowane z odpowiednich elementów wewnętrznej krotki.

Można założyć, że każdy typ pojawia się maksymalnie raz w krotce i że Get będzie wywoływane tylko z sensownymi parametrami szablonu, które znajdują się w krotce.

Odpowiedz

8

W rzeczywistości jest to łatwiejsze niż myślisz. std::get wykonuje typu, jako alternatywa do Index krotki (od C++ 14) i wraca do pierwszego typu dopasowanie z krotki:

#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; 
} 

wyjścia reagujące gcc 6.3.1:

1 
0 2 
+2

"Pierwszy pasujący typ" wprowadza w błąd. Jeśli typ występuje więcej niż jeden raz, program jest źle sformułowany. –