编译器如何处理这个没有size参数的模板化函数
How does the compiler handle this templated function with no size parameter
在下面的代码中,我有一个必须传递长度参数的函数,如下所示:
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];
}
}
此功能称为"模板参数推导"。详情请参阅链接
简短版本:如果在调用模板化函数时,模板参数(类型,或者在您的情况下,数组大小)可以从调用函数的参数(在您的情况下,实际数组)中推断出来,则不必显式指定它们。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- 如何在实现vector时使用C++"size()"作为函数的参数
- C++ std::string length() 或 size() 不适用于方法参数
- 初始化私有成员数组w/size作为类初始化参数
- C++模板,vector.size用于默认参数定义
- 编译器如何处理这个没有size参数的模板化函数
- 错误 C2664: 'cv::Mat::Mat(int,int,int)' : 无法将参数 1 从 'cv::Size' 转换为 'int'
- 为什么size不是std::initializer_list的模板参数?