2016-11-14 5 views
2

これは明白なはずですが、サブプレットを得るための短い構文がありますか?そのようなタプルから複数の型を抽出する

何か:

std::tuple<std::string, double, int> myTuple; 
std::tuple<std::string, int> subTuple = std::get<std::string, int>(myTuple); 
+0

std::tuple<std::string, double, int> myTuple = ...; std::string a; int b; std::tie(a, std::ignore, b) = myTuple; 
'のstd ::タプル<はstd ::文字列、整数> subTuple {STD :: <0>(myTuple)を取得、のstd ::得る<2>(myTuple)}。 '? – CompuChip

+0

2つの取得で何が問題なのですか?メタテンプレートのトリッキーでもっと一般化できると確信していますが、その価値はありますか? – rubenvb

+0

@rubenvb、私はstdライブラリがそれを持っていると思った。 – Velkan

答えて

4

あなたはこの実装の下に、独自のテンプレート関数を作成する必要がありますが(それがstd::get<T>を必要とするため、あなたがC++ 11自分でそれを実装することができます)C++ 14が必要です。

template<typename... R, typename ...Args> 
std::tuple<R...> sub_tuple(const std::tuple<Args...>& original) { 
    return std::make_tuple(std::get<R>(original)...); 
} 

int main() 
{ 
    std::tuple<std::string, double, int> myTuple = std::make_tuple("Hello", 1201.0, 51); 
    std::tuple<std::string, int> subTuple = sub_tuple<std::string, int>(myTuple); 
    std::cout << std::get<0>(subTuple) << "   " << std::get<1>(subTuple); 
} 

注:これは、元のタプルの各要素のコピーを作成します

関連する問題