我有一个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 *output2)
在数学上,“myfunction”能够计算出精确的输出,尽管数组大小.我不想复制“myfunction”,因为用户可以将总共5种不同的数组大小定义为输入.
有任何想法吗?先感谢您
解决方法
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#集合,将为我们的使用生成一个函数.
腐烂问题的解决方法是什么?
我们应该传递对T []的引用,而不是传递原始的T [].这样,类型不会衰减,并且数组的大小将是已知的.
句法?
人们可能会注意到T(& name)[some_size]至少看起来很奇怪.括号是必需的,因为普通的T& name [size]将被解释为T& name [size],它是一个引用数组,而不是对数组的引用.
结论:
能够检测传递为参数的数组的大小,我们不希望用一两种情况限制自己 – 我们想要全部覆盖它们,所以我们使用模板生成具有N#所需值的函数.