2017-01-02 19 views
6

私はこのような変数の型のタプルを含むクラスを持っている:新しいタプルでタプルのサブセットを抽出するには?

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

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

例のインスタンスは、私は私のGet関数は、内部タプルのサブセットのみを返すようにしたいTester<int, float, char>

です。たとえば、tester.Get<int, char>は、内部タプルの適切なメンバーから値がコピーされるstd::tuple<int, char>を返します。

タプル内で各型が最大1回出現すると仮定することができます。Getは、タプル内にある分かりやすいテンプレートパラメータでのみ呼び出されます。

答えて

8

実際、これは思ったよりも簡単です。 std::getは、(C++ 14以降)タプル部材指標の代替として、タイプを取り、タプルから最初に一致した型を返す:

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

出力、GCC 6.3.1でテスト:

1 
0 2 
+2

「最初に一致するタイプ」は誤解を招く可能性があります。タイプが複数回出現する場合、プログラムは不正です。 –

関連する問題