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

aka*_*nuk 4 c++ templates

考虑这件作品:

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

我通过特定实例调用它,因此对于3的数组我将不得不这样做:

array<int, 3> some_array_of_3;
fill_with_magic<3>(some_array_of_3);
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*ack 6

问题是争论的演绎:的第二个模板参数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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • `size_type`必须是`size_t`,因此使用它既便携又简单. (4认同)