2016-11-08 157 views
0

如果我声明一个数组(使用C++类模板)像这样,如何将数组对象(类模板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

相关/ dupe:http:// stackoverflow。COM /问题/ 17156282 /传球-A-stdarray-的未知大小到一个功能。尽管答案不是最大的粉丝。 – NathanOliver

+0

为什么我不能只将数组对象作为对象发送。这实际上是我的查询。 –

回答

4

使函数模板,以避免硬编码它的大小:

template<size_t S> 
void f_print(array<int, S> object){} 

看到一个Live Demo

+0

为什么我不能仅将数组对象作为对象发送。这实际上是我的查询 –

+3

@JabedHossain因为'std :: array'的每个模板参数组合形成它自己的类。这些不是真正相关的,不能被推断为数组对象。此外,如果这是你真正的问题,为什么你不把它放在你的问题? –

+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

我认为选项D:模板接受容器的参数: 'template void f_print const T&object);' 也适合OP的需要 – AndyG

+0

为什么我不能将数组对象作为唯一对象发送。这实际上是我的查询 –

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

+0

我知道我可以使用std :: vector,但我想知道,因为我声明类类型的对象数组为什么数组不会像对象一样用作函数参数时的行为。但谢谢你的答案。从中学习。 –

相关问题