2015-10-17 58 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"。请参阅链接查看更多细节。

简短版本:如果在调用模板函数时,可以从调用函数的参数中推导出模板参数(类型,或者你的情况,数组大小)(在你的情况下,实际的数组),你不必明确指定它们。