如何将不同大小的数组传递给我的c ++函数?

时间:2018-09-14 01:22:30

标签: c++ arrays function input

我不确定这是否可行,但我愿意接受。

我有一个c ++函数。它会对用户定义为输入的数组进行一些计算,并将生成两个输出值。我们称之为“ myfunction”,它看起来像这样:

  

void myfunction(double array1 [18],double array [9],double array [2],double * output1,double * output2)

我想使此函数更通用,以便能够接受不同大小的数组。意思是,我希望该函数的用户能够定义其他大小的数组输入。

例如,

  

void myfunction(double array1 [81],double array [27],double array [3],double * output1,double * output2)

从数学上讲,尽管数组大小,“ myfunction”仍能够计算出准确的输出。我不想复制“ myfunction”,因为用户可以定义总共5组不同的数组大小作为输入。

有什么想法吗?预先谢谢你

1 个答案:

答案 0 :(得分:8)

您可以通过std::vector或使用template

template <std::size_t N1, std::size_t N2, std::size_t N3> // and so on...
void work_with_arrays(double (&arr1)[N1], double (&arr2)[N2], double (&arr3)[N3]){
    std::cout << "First arr of a size: " << N1 << "\n";
    std::cout << "Second arr of a size: " << N2 << "\n";
    std::cout << "Third arr of a size: " << N3 << "\n";
};

int main() {
    double something[32];
    double fewer[13];
    double maybe_byte[8];

    work_with_arrays(something, fewer, maybe_byte);
}

代码输出:

First arr of a size: 32
Second arr of a size: 13
Third arr of a size: 8

说明:

应该知道T[]类型的自变量(T是任意类型)对T*的衰变。如果我们要处理的是指向数组的指针,那么我们就没有关于其长度的信息,这是非常不幸的,因为固定长度数组的长度在编译时是已知的,并且在我们使用它们的任何地方都可以看到。

还应该知道功能模板不是功能。它是用于创建函数的模板。对于以上示例中使用的N#的每个不同集合,都会生成一个供我们使用的函数。

该衰减问题的解决方法是什么?

我们应该传递 reference T[],而不是传递原始的T[]。这样,类型不会衰减,并且数组的大小将是已知的。

语法?

人们可能注意到T (&name)[some_size]看起来至少很奇怪。括号是必需的,因为纯T &name[size]将被解释为T& name[size],它是引用的数组,而不是对数组的引用

结论:

为了能够检测传递参数数组的大小,我们不想将自己限制在一种或两种情况下-我们想全部覆盖,因此我们使用template生成具有所需值N#的函数。