gpt4 book ai didi

c++ - 这个模板魔法如何确定数组参数大小?

转载 作者:IT老高 更新时间:2023-10-28 21:45:39 24 4
gpt4 key购买 nike

在下面的代码中

#include<iostream>

template<typename T,size_t N>
void cal_size(T (&a)[N])
{
std::cout<<"size of array is: "<<N<<std::endl;
}

int main()
{
int a[]={1,2,3,4,5,6};
int b[]={1};

cal_size(a);
cal_size(b);
}

正如预期的那样,两个数组的大小都被打印出来了。但是 N 如何自动初始化为数组大小的正确值(数组是通过引用传递的)?上面的代码是如何工作的?

最佳答案

N 不会“初始化”任何东西。它不是一个变量。它不是一个对象。 N 是编译时常量。 N 仅在编译期间存在。 N 的值以及实际的T 由称为模板参数推导 的过程确定。 TN 都是从您传递给模板函数的参数的实际类型推导出来的。

在第一次调用中,参数类型是 int[6],因此编译器推断出 T == intN == 6,为此生成一个单独的函数并调用它。我们将其命名为 cal_size_int_6

void cal_size_int_6(int (&a)[6]) 
{
std::cout << "size of array is: " << 6 << std::endl;
}

请注意,此函数中不再有 TN。两者都在编译时被它们的实际推导值替换。

在第一次调用中,参数类型是 int[1],因此编译器推断出 T == intN == 1,也为此生成一个单独的函数并调用它。我们将其命名为 cal_size_int_1

void cal_size_int_1(int (&a)[1]) 
{
std::cout << "size of array is: " << 1 << std::endl;
}

这里也一样。

你的 main 基本上翻译成

int main() 
{
int a[]={1,2,3,4,5,6};
int b[]={1};

cal_size_int_6(a);
cal_size_int_1(b);
}

换句话说,您的 cal_size 模板生成了两个不同的函数(原始模板的所谓特化),每个函数都有不同的N(和 T)的值硬编码到正文中。这就是模板在 C++ 中的工作方式。

关于c++ - 这个模板魔法如何确定数组参数大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384107/

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