无法理解C++11模板函数参数的推导

无法理解C++11模板函数参数的推导,c++,c++11,templates,overloading,C++,C++11,Templates,Overloading,当然可以打印10张 我对模板和类型推断的工作原理有一些基本的了解,但我不理解这段代码。我背后的魔力是什么?我们如何从传递给func的int2type实例中知道I?C++14标准的[temp.decrete.call]部分介绍了模板参数推断。它太大,无法完整复制,但要点是编译器将比较参数类型int2type和参数类型int2type,并尝试为I找到一个使两者相同的值 在[temp.decrete.type]/9和/17中,指定参数类模板名称(其中i是非类型模板参数)与参数类模板名称匹配,其中n是相

当然可以打印10张


我对模板和类型推断的工作原理有一些基本的了解,但我不理解这段代码。我背后的魔力是什么?我们如何从传递给func的int2type实例中知道I?

C++14标准的[temp.decrete.call]部分介绍了模板参数推断。它太大,无法完整复制,但要点是编译器将比较参数类型int2type和参数类型int2type,并尝试为I找到一个使两者相同的值


在[temp.decrete.type]/9和/17中,指定参数类模板名称(其中i是非类型模板参数)与参数类模板名称匹配,其中n是相同类型的参数。

我看不出这有什么神奇之处。编译器希望某些I的参数为int2type。您传入的参数类型为int2type。编译器比较了它们,发现我必须是10才能使这两种类型相同。哦,是的!现在我明白了。非常感谢。
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>() ); 
}