2015-01-14 24 views
6

は、私は次の関数している:私はタプル型を与え、機能、CheckTupleを書くことができますどのようにC++ 11:テンプレート関数からのstd ::タプルを構築

template<class T> 
T Check(int index); 

は、移入タプルとCheckの呼び出し?例えば

CheckTuple< std::tuple<int, float, std::string> >() 

は、次のタプルを返します:

std::make_tuple(Check<int>(1), Check<float>(2), Check<std::string>(3)) 

私はこの方法アップ1を構築していない、与えられたタプルをアンパック伴うご覧ください他の質問。

+0

あなたは可変長引数テンプレート関数に精通していますか? –

+0

少し。私はここ数日でそれらを使い始めました。 – Taylor

+0

ここで問題は何ですか? – tumdum

答えて

4

を使用すると、C++ 14のinteger_sequenceを使用してかなり簡単になる探しているものを実装します。利用可能なものがない場合は、Jonathan Wakelyによって書かれたhere's a C++11 implementationです。

template<typename Tuple, int... I> 
Tuple CallCheck(std::integer_sequence<int, I...>) 
{ 
    return std::make_tuple(Check<typename std::tuple_element<I, Tuple>::type>(I)...); 
} 

template<typename Tuple> 
Tuple CheckTuple() 
{ 
    return CallCheck<Tuple>(std::make_integer_sequence<int, std::tuple_size<Tuple>::value>()); 
} 

// Use it as 
auto tup = CheckTuple<std::tuple<int, float, std::string>>(); 

Live demo

2

ここに私の実装テストの実装です。 (おそらく誰かが簡潔という点で、それを改善する方法のアイデアを持っている。私は何とかTupleInfoを取り除くことはできますか?)

#include <typeinfo> 
#include <tuple> 
#include <iostream> 

template<class T> 
T Check(int i) { 
    std::cout << "getting a " << typeid(T).name() << " at position " << i << std::endl; 
    return T(); 
} 

template<typename Signature> 
struct TupleInfo; 

template<class T, class... Args> 
struct TupleInfo< std::tuple<T, Args...> > { 
    using Head = T; 
    using Tail = std::tuple<Args...>; 
}; 

template<int N, class Tuple> 
struct TupleChecker { 

    static Tuple CheckTuple() { 
     auto t = std::make_tuple(Check<typename TupleInfo<Tuple>::Head>(N)); 
     return std::tuple_cat(t, TupleChecker<N+1, typename TupleInfo<Tuple>::Tail >::CheckTuple()); 
    } 

}; 

template<int N> 
struct TupleChecker<N, std::tuple<> > { 

    static std::tuple<> CheckTuple() { 
     return std::tuple<>(); 
    } 

}; 

template<class Tuple> 
Tuple CheckTuple() { 
    return TupleChecker<1, Tuple>::CheckTuple(); 
} 

int main() { 

    std::tuple<> t0 = CheckTuple<std::tuple<> >(); 

    std::tuple<int> t1 = CheckTuple<std::tuple<int> >(); 

    std::tuple<int, float, std::string> t2 = CheckTuple<std::tuple<int, float, std::string> >(); 

    return 0; 

} 
関連する問題