2015-10-17 44 views
1

在下面的代碼,我有其中的長度參數必須傳遞的函數,就像這樣:編譯器如何處理這個模板函數沒有大小參數

int recv(char* buf, int len); 

但是便利是寫一個幫手像這樣的功能:

template <size_t N> 
    int recv(char(&array)[N]) { 
     return recv(array, N); 
    } 

這意味着你可以通過一個數組,編譯器以某種方式「知道」的大小,所以你不必通過。

但是,當我以前使用的模板,我需要通過類型,例如

std::vector<int> myvec; 

但如何運作的?在內部,編譯器正在做什麼來解決這個問題?這個特性的名字是什麼?

請解釋語法。

#include <string.h> 
#include <iostream> 

class test_recv 
{ 
public: 
    test_recv() { 
     strcpy(arr, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
    } 
    int recv(char* buf, int len) { 
     int tmp = pos; 
     while (len-- && pos < 26) 
      *buf++ = arr[pos++]; 

     return pos - tmp; 
    } 
    template <size_t N> 
    int recv(char(&array)[N]) { 
     return recv(array, N); 
    } 

private: 
    int pos = 0; 
    char arr[26+1]; 
}; 


int main() { 
    test_recv test; 
    char buffer[10]; 
    int bytes; 
    while ((bytes = test.recv(buffer, 10)) != 0) { 
     for (int i = 0; i < bytes; ++i) 
      std::cout << buffer[i]; 
    } 

    std::cout << '\n'; 
    test_recv test2; 
    char buffer2[10]; 
    while ((bytes = test2.recv(buffer2)) != 0) { 
     for (int i = 0; i < bytes; ++i) 
      std::cout << buffer2[i]; 
    } 
} 
+0

「但是,當我以前使用過模板時,我需要傳遞類型」嘗試函數模板,比如'std :: find'。 – juanchopanza

回答

0

該功能被稱爲"template argument deduction"。請參閱鏈接查看更多細節。

簡短版本:如果在調用模板函數時,可以從調用函數的參數中推導出模板參數(類型,或者你的情況,數組大小)(在你的情況下,實際的數組),你不必明確指定它們。

相關問題