#include <iostream>
#include <array>
#define print(x) std::cout << x
#define println(x) std::cout << x << std::endl
template<std::size_t Size>
void Print(std::array<int, Size>& arr) {
for (int i = 0; i < Size; i++) {
println(arr[i]);
}
}
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
Print(arr);
}
如何在不像print<5>(arr)
那样定义大小的情况下将大小传递给函数模板? (第7行“实际模板”,第16行“调用函数”)
如何在不像print<5>(arr)
那样定义大小的情况下将大小传递给函数模板?
这要归功于模板论证推演。 大小是从调用print(arr)
中推导出来的。 print()
是具有std::size_t
类型的非类型模板参数(即size
)的函数模板:
template<std::size_t Size>
void Print(std::array<int, Size>&);
也就是说,模板参数size
被推导为std::size_t
类型的值,该值对应于调用print()
时作为函数参数传递的std::array
的第二个模板参数。
这被称为“模板参数推导”,它可以根据你传递的内容来计算。
https://en.cppreference.com/W/cpp/language/template_argument_deliveration