如果我声明一个数组(使用c ++类模板),
#include <array> //standard c++ library
int main()
{
array<int,3> myarray{10,20,30};
}
我如何能够将此数组对象作为参数发送给函数。
如果我像这样通过它可以工作:
void f_print(array<int, 3> object){}
int main()
{
array<int, 3> myarray{10,20,30};
f_print(myarray);
}
但这里的问题是我很难编码函数的大小。像这样工作的整点使用数组作为对象类型,所以我可以使用array.size()。 那么如何在不硬编码大小的情况下传递此数组类型对象(c ++类模板)。
Edit_1:为什么我不能将数组对象作为一个对象发送到我在函数参数中使用对象的所有属性的对象。
答案 0 :(得分:5)
您可以模拟数组类型
template<typename T>
void f_print(std::array<T, 3> const& object);
或大小
template<size_t S>
void f_print(std::array<int, S> const& object);
或两者:
template<typename T, size_t S>
void f_print(std::array<T, S> const& object);
编译器应该能够在所有情况下推导出正确的模板参数。
答案 1 :(得分:4)
答案 2 :(得分:1)
我认为你错过了数组的重点。它的大小属于其类型,这就是数组的本质。这就是原始数组的情况,同样也是std::array
的情况。在函数中对std::array<int, 3>
的大小3进行硬编码与对int
进行硬编码一样不可避免。
事实上,根据我的经验,认为关于数组的最佳方式,例如int[4]
或std::array<int, 4>
,是int a, b, c, d
的简写。
我说模板只是以一种非常肤浅的方式绕过这个问题。如果使用size参数创建模板,那么对于不同的数组类型,最终只会有许多不同的函数。 std::array<int, 3>
,std::array<int, 4>
,std::array<int, 5>
等等都会导致不同的模板实例化。它与您最终使用std::array<int, 3>
,std::array<double, 3>
和std::array<std::string, 3>
的不同模板实例的方式相同。
请注意,将大小转换为模板参数可能仍然是您实际寻找的解决方案。但是,如果您需要一个在编译时未知大小的容器,请使用std::vector
。