gpt4 book ai didi

c++ - 编译器如何处理这个没有大小参数的模板函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:34 25 4
gpt4 key购买 nike

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

int recv(char* buf, int len);

但是一个方便的方法是像这样写一个辅助函数:

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

这意味着您可以传递一个数组,而编译器以某种方式“知道”大小,因此您不必传递它。

但是之前用过模板的时候,需要传类型,eg

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

最佳答案

此功能称为 "template argument deduction" .有关详细信息,请参阅链接。

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

关于c++ - 编译器如何处理这个没有大小参数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com