如何使编译器推断正确的模板整数为我

How to make compiler infer the right template integer for me

本文关键字:整数 编译器 何使      更新时间:2023-10-16

考虑这段:

template <int N> void fill_with_magic(array<int, N>& whatever){
    for(int i = 0; i < N; i++){
        whatever[i] = magic(i, N);
    }
}

我通过特定的实例调用它所以对于数组为3的数组,我必须这样做:

array<int, 3> some_array_of_3;
fill_with_magic<3>(some_array_of_3);

但是我真的要写<3>吗?编译器已经知道数组的大小,所以理论上它可以根据这个大小推断出正确的实例。我真的能做到吗?

问题在于参数的推导:std::array的第二个模板参数不是int,因此推导不会发生,因为它需要转换。

你应该把你的方法定义为
template <array<int, 0>::size_type N> void fill_with_magic(array<int, N>& whatever){
  for(int i = 0; i < N; i++){
    whatever[i] = magic(i, N);
  }
}

因此,您正确地期望array<int,0>::size_type作为参数,然后将正确地推导。实际上,我认为大多数实现都使用size_t,但这应该更可移植(除非std::array<T, 0>获得特殊的专门化)。