2016-06-01 2 views
4

シンプルなタイプリストの実装があります。タイプリストからベクトルのタプルを作成します。

template<typename... Ts> 
struct Typelist 
{ 
    static constexpr size_t count{sizeof...(Ts)}; 
}; 

はtypelistに種類ごとにstd::vector>std::tupleを生成するために、私はそれで何をしたいのか、です。例えば:

template<template<typename... Ts> class T> 
struct List 
{ 
    using type = std::tuple<std::vector<Ts>...>; 
}; 

しかし、それはタイプを期待していること、バック吐き続け:

struct A {}; 
struct B {}; 
struct C {}; 

using myStructs = typelist<A,B,C>; 
using myList = tupleOfVectorTypes<myStructs>; tuple<vector<A>, vector<B>, vector<C>> 

これは、私が一緒に遊んでいたものです。

using type = std::tuple<std::vector<decltype(Ts)>...>;

をしかし、それは同様に間違っている、と私は私も間違ってdecltypeを使用しています推測している:私はそうのように、decltypeでTsのをラップしようとしました。 型リストの型に基づいて型のベクトルのタプルを作成するにはどうすればよいですか?

答えて

5

トリックは、特殊化を使用してテンプレートパラメータをドリルダウンすることです。ここで

#include <vector> 
#include <tuple> 

template<typename... Ts> 
struct Typelist{ 
}; 

// Declare List 
template<class> class List; 

// Specialize it, in order to drill down into the template parameters. 
template<template<typename...Args> class t, typename ...Ts> 
struct List<t<Ts...>> { 
    using type = std::tuple<std::vector<Ts>...>; 
}; 

// Sample Typelist 

struct A{}; 
struct B{}; 
struct C{}; 

using myStructs = Typelist<A,B,C>; 

// And, the tuple of vectors: 

List<myStructs>::type my_tuple; 

// Proof 

int main() 
{ 
    std::vector<A> &a_ref=std::get<0>(my_tuple); 
    std::vector<B> &b_ref=std::get<1>(my_tuple); 
    std::vector<C> &c_ref=std::get<2>(my_tuple); 
    return 0; 
} 
+0

恐ろしいです!私はまだvariadicテンプレートについて少しは学んでいますが、なぜこれが正確に動作するのか説明できますか? 'テンプレートクラスt、型名... Ts> 構造体リスト> { type = std :: tuple ...>を使用すると、 ; }; ' リストはTsの型を保持する型tであることがわかりますが、なぜ... Tsはすべての型を持っていますが... Args? – Acorn

+1

'template