通过模板发送参数有什么用途吗?如果是这样,这与通过内部堆栈发送参数有何不同?例如:
void myMethod(int argument){//Do something with *argument* };
VS
template<int argument>
void myMethod(){//Do something with *argument* };
在 Thinking in C ++ ,第1卷,第2版,模板深入一章中,关于非类型模板参数的说法很少,我觉得我并没有完全理解他们的目的。
编辑: 感谢您的解释。如果可以,我会标记两个答案,因为它们互为补充。
答案 0 :(得分:1)
不同之处在于,对于模板,值在编译时决定并修复;即,编译程序时。在编译完成后,你无法改变它们,并且它们永远被认为是常量。
所以,用:
template<int argument>
void myMethod(){//Do something with *argument* };
如果您调用myMethod<5>()
,则argument
的值始终为5,并且该函数在运行时几乎没有任何参数。现在,如果调用myMethod<6>()
,编译器将重新创建相同的函数,但使用另一个常量值。因此,您在运行时将拥有2个函数。
另一方面,使用常规方法,您可以在运行时更改它们,即在程序运行时更改它们。再次调用该函数将只执行具有不同参数值的相同代码。
示例:
template <int L>
void DoSomething()
{
int a[L]; //this works fine here! Becasue L is just a constant that is resolved at compile-time
for(int i = 0; i < L; i++)
{
//do stuff
}
}
void DoSomething(int L)
{
int a[L]; //this won't work, because L is a variable that can be set while the program is running
for(int i = 0; i < L; i++)
{
//do stuff
}
}
答案 1 :(得分:1)
下面:
void myMethod(int argument){//Do something with *argument* };
参数在runTime期间传递给myMethod,因此可以传递不同的值。
下面:
template<int argument>
void myMethod(){//Do something with *argument* };
argument
模板参数在编译时传递。
非类型模板参数在与类一起使用时具有更大的含义,即:
template<int N>
class Test{};
typedef Test<1> test1_type;
typedef Test<2> test2_type;
static_assert(std::is_same<test1_type, test2_type>::value == false, "");
test1_type
和test2_type
是不同的类型