2017-01-25 12 views
0

私はいくつかのコードを読んでいますが、TH_convert<Elements>::t()...を理解する方法を理解できません。私はいくつかのC++テンプレートコードを理解できません

  1. 私はGoogleで検索し...printf(char **, ...)のような引数の変数番号に使用することができることを見出しました。ただし、次の行は異なります。

  2. 誰かがメンバー関数をvoid test(...)と宣言したことがあります。可変引数の関数が最初の引数を必要とするため、正しいですか?

class TH_convert{ 
public: 
    typedef std::tuple<Element> t; 
}; 

template<typename... Elements> 
class State{ 
public: 
    typedef decltype(std::tuple_cat(typename TH_convert<Elements>::t()...)) t; 
}; 
+3

http://en.cppreference.com/w/cpp/language/parameter_pack – lapk

+0

「TH_convert t()...はかなり誤植です。 – kamikaze

+1

@Danh OPは 'TH_convert :: t()...'と入力することを意味していたので、もっと意味があります。 – kamikaze

答えて

2

私は少しずつそれを打破するでしょう。

template<typename... Elements> 
class State{ 
    //... 
}; 

これは、任意の数のテンプレートパラメータを取る状態と呼ばれるvariadic class templateを定義します。 State<int,bool>State<Foo,Bar,Baz,Qux>、さらにState<>のように有効な特殊化です。

decltype(/*...*/) 

decltypeは、本質的に、あなたが/*...*/に置かれたあらゆる式の型に置き換えられます。

typedef decltype(/*...*/) t; 

これはt/*...*/のタイプにかかわらずのためのtypedefを作ります。

typename TH_convert<T>::t() 

これはTH_convertのその定義所与、std::tuple<T>と同じである、タイプTH_convert<T>::tのオブジェクトを作成します。 dependent typeなのでtypenameが必要です。

std::tuple_cat(typename TH_convert<Elements>::t()...) 

これは、パラメータパックElements内のすべてのTためtypename TH_convert<T>::t()std::tuple_catを呼び出します。だから、State<int,bool>のために、それは同等です:

std::tuple_cat(TH_convert<int>::t(), TH_convert<bool>::t()) 

State<Foo,Bar,Baz,Qux>のために、それは同じだ:だから

std::tuple_cat(TH_convert<Foo>::t(), TH_convert<Bar>::t(), 
       TH_convert<Baz>::t(), TH_convert<Qux>::t()) 

、すべてのことをまとめる:

typedef decltype(std::tuple_cat(typename TH_convert<Elements>::t()...)) t; 

をこれはt typedefの作りますstd::tuple_catの結果のタイプは、それぞれTTH_convert<T>::t()の結果となります。Elements

+0

なぜそれが 'typedef decltype(std :: tuple_cat(Elements()...)でないのかわかりませんが...))t; '、TH_convertはここで余分に見える – Caleth

+0

@Caleth私はこれが単純化されたバージョンだと仮定した。そうでなければ' t = std :: tuple ; 'を使うことができる。 – TartanLlama

+0

...ええ、私は十分に簡素化していませんでした。それ自身のために複雑な臭いはありますか – Caleth

関連する問題