2016-10-17 2 views
1

C++ 11バリデーションタイプリストをポータブルパラメータパックのコンテナとして使用する方法に関する情報を見つけるのに問題があります。私はこのコードを持っていると言います。TypeListを元のパラメータパックに戻す方法

#include <type_traits> 

template <typename T, typename... Ts> 
struct Index; 

template <typename T, typename... Ts> 
struct Index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {}; 

template <typename T, typename U, typename... Ts> 
struct Index<T, U, Ts...> : std::integral_constant<std::size_t, 1 + Index<T, Ts...>::value> {}; 

私はこれを使用して、このようなパラメータパックの内部の型の最初のインデックスを見つけることができます。

int main() 
{ 
using namespace std; 

cout << Index<int, int>::value << endl;    //Prints 0 
cout << Index<char, float, char>::value << endl;  //Prints 1 
cout << Index<int, double, char, int>::value << endl; //Prints 2 
} 

どのようにタイプリストに対してこの動作を達成できますか?私はこのようなものを作り出そうとしています。

ここで、ConvertToParameterPackは、TypeListをParameterPackに戻すいくつかの方法です。私が求めていることが不可能な場合、これを解決する他の良い方法はありますか?

+0

この構文は不可能ですが、問題はさまざまな方法で解決できます。テンプレートとリストを取り込み、そのリストをテンプレートに展開するエクスパンダの作成と同じです。 'Index'を再定義するか、これは' Index'や 'Index'のような細部が不足しているのは単なる一例です。 – Yakk

+0

インデックスは単なる例でした。また、TypeListを他の関数のParameter Packに変換したり、TypeListからタプルを構築したりしたいと思います。私は、IndexListのようなコードをリファクタリングして、TypeListのアプローチの必要性を感じています。ありがとうございます。 – Brian

答えて

1
template<std::size_t I> 
using index_t=std::integral_constant<std::size_t,I>; 

template<class T, class List> 
struct Index{}; 

template<class T, class...Ts> 
struct Index<T, TypeList<T,Ts...>>: 
    index_t<0> 
{}; 

template<class T,class U, class...Ts> 
struct Index<T, TypeList<U,Ts...>>: 
    index_t< 1+Index<T,TypeList<Ts...>::value > 
{} 
+0

これには、型リストのメソッドをオーバーロードするのがよいでしょうか? – Brian

関連する問題