2016-10-19 7 views
3

私は以下のことを理解するのが難しいです。なぜ、このコードは(私がfoo2のデフォルト引数を使用)std :: index_sequenceのデフォルト引数を使用

template <size_t N, size_t... N_i, size_t... M_i> 
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>()) 
{ 

    constexpr size_t values[] = {N_i...}; 
    return A<values[M_i]...>(); 
} 


template <size_t N,size_t... N_i> 
auto foo() 
{ 
    return foo2<N,N_i...>(std::make_index_sequence<N>()); 
} 


int main() 
{ 
foo<2, 1,2,3>(); 
} 

が、これではないのコンパイルん:事前に

template <size_t N, size_t... N_i, size_t... M_i> 
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>()) 
{ 

    constexpr size_t values[] = {N_i...}; 
    return A<values[M_i]...>(); 
} 


template <size_t N,size_t... N_i> 
auto foo() 
{ 
    return foo2<N,N_i...>(); 
} 


int main() 
{ 
foo<2, 1,2,3>(); 
} 

感謝を。

答えて

4

を考える:

template <size_t N, size_t... N_i, size_t... M_i> 
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>()); 

あなたが明示的に指定することはできませんM_i(シーケンスはちょうどN_iの一環として飲み込まになるだろうからです)。引数を指定すると、コンパイラはテンプレート引数の控除を使用して、M_iが何であるかを調べることができます。 が指定されていない場合、コンパイラはM_iが何であるかを推測する方法がありません(また、デフォルト引数が必要であると判断する前に、その引数が何であるかを知る必要があります)。

が、これは、より大きな全体の小さい部分であると仮定すると、修正が続いて

template <size_t N, size_t... N_i, size_t... M_i> 
auto foo2(std::index_sequence<M_i...>) 
{ 

    constexpr size_t values[] = {N_i...}; 
    return A<values[M_i]...>(); 
} 


template <size_t N,size_t... N_i> 
auto foo2() 
{ 
    return foo2<N,N_i...>(std::make_index_sequence<N>()); 
} 

を書くことで、あなたは実際に書くことができます:

template <size_t N,size_t... N_i> 
auto foo() 
{ 
    return foo2<N,N_i...>(); 
} 
関連する問題