编译器如何处理这个没有size参数的模板化函数

How does the compiler handle this templated function with no size parameter

本文关键字:参数 size 函数 何处理 处理 编译器      更新时间:2023-10-16

在下面的代码中,我有一个必须传递长度参数的函数,如下所示:

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];
    }
}

此功能称为"模板参数推导"。详情请参阅链接

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