2016-04-28 11 views
2
template<std::size_t... Is> 
void unlock_(std::index_sequence<Is...>) { 

    iter(std::get<Is>(tuple)...); 
} 

上記の例を考えてみましょう。私は理解できませんiter(std::get<Is>(tuple)...);。私は...が "演算子"を展開していることを知っています。したがって、パラメータパック(意味のある引数)またはテンプレートのパラメータメーターパックに適用する必要があります。 そして、私はstd::index_sequence<Is...>が何であるか想像することができます。 Isはテンプレートパラメータパックなので、1, 2, 3, 4, ...(たとえば)にする必要があります。 この場合、outパラメータは型ではないため、固有です。それはsize_tです。TMP C++およびパラメータパック

しかし、ここでは:std::get<Is>(tuple)...);std::get<Is>(tuple)はパラメータ/テンプレートパックを返しません。したがって、私は使用法のコンテキストがありません。

P.S.メタプログラミングの後のコードの見た目を見ることは可能でしょうか?アフター・アフター・プロセシングと同様に?

ありがとうございます。

+3

pack変数を含む式全体が展開されるので、 'std :: get <1>(タプル)、std :: get (タプル)'、.... –

+1

[パック拡張](http: /en.cppreference.com/w/cpp/language/parameter_pack)セクションの[パラメータパックのcppreferenceページ](http://en.cppreference.com/w/cpp/language/parameter_pack)では、この動作の仕組みについて説明しています。 – Andrew

+1

パラメータパック展開は非常に複雑で、引数ではなく式全体が展開されます。 – SergeyA

答えて

2

これは、インデックスのコンパイル時シーケンスを生成することによってstd::tupleを拡張する方法です。

...このコンテキストでは、拡張されていないパラメータパックを含むフォームが展開されます。これは、このようなリストを生成します。

Is... 
0,1,2,... 

doSomething(Is)... 
doSomething(0), doSomething(1), doSomething(2), ... 

doSomething(Is...) 
doSomething(0,1,2,...) 

std::get<Is>(tuple)... 
std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ... 

iter(std::get<Is>(tuple)...) 
iter(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ...) 

効果がiterがタプルから抽出された引数で呼び出されていることです。

関連する問題