2017-03-03 211 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