我不确定这是否可行,但我愿意接受。
我有一个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组不同的数组大小作为输入。
有什么想法吗?预先谢谢你
答案 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#
的函数。