了解函数模板中的模板参数推导
考虑以下代码,其中函数模板 cal_size 用于计算和打印数组的大小:
#include <iostream> template <typename T, size_t N> void cal_size(T (&a)[N]) { std::cout << "size of array is: " << N << std::endl; }
当程序执行时,它会打印正确的大小两个数组:
int a[] = {1,2,3,4,5,6}; int b[] = {1}; cal_size(a); cal_size(b);
那么,模板函数 cal_size 如何自动推导出传递数组的大小,即使大小没有作为参数显式传递?
答案在于C 中模板参数推导的概念。它的工作原理如下:
在编译期间,编译器会根据传递给模板函数的参数的实际类型执行模板参数推导,以确定 T 的类型和 N 的值。在这种情况下,当使用参数 a 调用 cal_size 时,编译器将 T 推断为 int,将 N 推断为 6,从而在编译时创建一个专门的函数 cal_size_int_6:
void cal_size_int_6(int (&a)[6]) { std::cout << "size of array is: " << 6 << std::endl; }
同样,对于参数 b,编译器将 T 推导为 int,将 N 推导为 1,从而产生特化cal_size_int_1:
void cal_size_int_1(int (&a)[1]) { std::cout << "size of array is: " << 1 << std::endl; }
因此,原始 cal_size 模板有效地创建了两个单独的函数专业化,每个函数都有自己的硬编码 T 和 N 值。此过程可确保每次调用 cal_size 时打印正确的数组大小。
以上是C 模板参数推导如何确定函数模板中的数组大小?的详细内容。更多信息请关注PHP中文网其他相关文章!