2017-02-23 51 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>()); 
} 

当然它打印10无法理解C++模板11函数参数扣

我的模板和类型推导如何工作的一些基本的想法,但我无法理解这样的代码。 I背后的魔法是什么?我们如何知道I from int2type实例传递给func

+3

我不明白这有什么神奇的。编译器希望某些'I'的参数为'int2type '。你传入一个类型为'int2type <10>'的参数。编译器对它们进行比较,并发现'I'必须是'10'才能使这两种类型相同。 – Brian

+0

哦,是的!现在我看到它是如何工作的。谢谢! – sigmaN

回答

1

模板参数推导由C++ 14 Standard的section [temp.deduct.call]覆盖。它完全不能完全重现,但要点是编译器会将参数类型int2type<10>与参数类型int2type<I>进行比较,并尝试找到I的值,这两个值都相同。

在[temp.deduct.type]/9和它被指定/ 17,参数class-template-name<i>,其中i是非类型模板参数,由参数class-template-name<n>其中n是同一类型的参数相匹配。