2017-02-23 3 views
0
template <int T> struct int2type{}; 

template<int I> 
void func(int2type<I>) 
{ 
    printf("int_val: %i\n", I); 
} 

int main(int argc, char *argv[]) 
{ 
    func(int2type<10>()); 
} 

を理解することはできません私は、テンプレートとタイプ控除がどのように動作するかのいくつかの基本的な考え方を持っている、しかし、私はこのコードを理解することはできません。 Iの背後にある魔法は何ですか?我々が知っている方法Iからint2typeインスタンスがfuncに渡されましたか?はそれが10</p> <p>を印刷します。もちろん、C++ 11テンプレート関数のパラメータ控除

+3

私はこれについて魔法を感じることはありません。コンパイラは、 'I'のために引数が' int2type 'となることを期待しています。 'int2type <10>'型の引数を渡します。コンパイラはそれらを比較し、2つの型が同一であるためには「I」が「10」でなければならないことを知る。 – Brian

+0

ああそう!今私はそれがどのように動作するかを見ます。ありがとうございました! – sigmaN

答えて

1

テンプレート引数の控除は、C++ 14標準の[temp.deduct.call]セクションでカバーされています。それは完全に再現するには大きすぎますが、コンパイラーは引数型int2type<10>とパラメーター型int2type<I>を比較し、両方を同じにするIの値を見つけようとします。 【temp.deduct.type]/9および/または17は、パラメータiが非型テンプレートパラメータであるclass-template-name<i>が、nは、同じタイプの引数である引数class-template-name<n>にマッチされることが指定されているで

関連する問題