2017-03-03 208 views
4

是否有任何目的通过模板发送参数?如果是这样,这与通过内部堆栈发送参数有什么不同?例如:C++:通过模板传递参数Vs通过函数参数

void myMethod(int argument){//Do something with *argument* }; 

VS

template<int argument> 
void myMethod(){//Do something with *argument* }; 

在书思考在C++,第1卷,第2版,在本章的深度模板下,只有大约非几个字输入模板参数,我觉得我没有完全理解它们的目的。

编辑:感谢您的解释。如果可以的话,我会标记两个答案,因为它们都相互补充。

+1

模板参数是编译时间常数。例如,当'argument'是一个模板时,你可以在'std :: array '语句中使用它。 –

回答

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 
    } 
} 
+0

这是一个谎言,因为'constexpr'突出显示,但是足够真实。 – Yakk

1

这里:

void myMethod(int argument){//Do something with *argument* }; 

参数在运行时间期间传递给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_typetest2_type不同类型

+0

你在第二个例子中缺少''。 –

+0

@FabianKlötzl修复 – marcinj