提问者:小点点

那是怎么回事! (模板<std::size_t size>)


#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行“调用函数”)


共2个答案

匿名用户

如何在不像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