考虑这件作品:
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>吗?编译器已经知道了数组的大小,因此理论上它可以根据该大小推断出正确的实例.我能真的做到吗?
问题是争论的演绎:的第二个模板参数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>获得特殊的专业化).