我有一个项目。在那个函数中,有些函数非常相似,因为差异只是计算的方法。一方面,我们使用平均计算,另一方面,我们使用中位数计算。 这些函数使用相同的参数和相同的代码。
这是区别:
find_median(some parameters)
{
/* some code */
best_windows_median(same parameters);
/* some code */
}
和
find_average(some parameters)
{
/* some code */
best_windows_average(some parameters);
/* some code */
}
,并且对于2-3个功能是相同的。如何将两个函数重新组合为一个,但保留使用中位数或平均值的选择?
答案 0 :(得分:3)
有几种方法可以做到这一点,包括传递一个值来切换要使用的计算,以及传递一个函数指针(如果感兴趣的话,这是依赖转换的本质)。
所以:
find_average(data parameters, avg_type) {
same code
switch (avg_type) {
case AVG_MEAN:
best_windows_mean(data parameters);
break;
case AVG_MEDIAN:
best_windows_median(data parameters);
break;
case AVG_MODE:
...
default:
report unrecognised option;
}
same code;
}
或
find_average(data parameters, best_windows_function) {
same code;
best_windows_function(data parameters);
same code;
}
使用哪种,取决于您是否对函数指针感到满意,以及您真正喜欢的那个指针。
答案 1 :(得分:3)
友好的功能可能隐藏了API的复杂性:
typedef enum { Median, Average } CentralTendencyMeasure;
find_median(parameters)
{
find_general(parameters, Median);
}
find_average(parameters)
{
find_general(parameters, Average);
}
find_general(parameters, CentralTendencyMeasure Measure)
{
Some code...
switch (Measure)
{
case Median: best_windows_median (parameters); break;
case Average: best_windows_average(parameters); break;
default: Report error.
}
Some code...
}
仅将find_median
和find_average
暴露给客户端,因此他们看不到CentralTendencyMeasure
或find_general
。
答案 2 :(得分:2)
如果编写一个带有参数的函数,则该函数可以作为函数的指针。
例如:
`
int add (int a, int b){
return a+b;
}
int mul (int a, int b){
return a*b;
}
int function (int a, int b, int (*func) (int, int))
{
return func(a,b);
}
int main (void){
int x = function(4, 3, add);
return EXIT_SUCCESS; }`
因此,此参数“ int(* func)(int,int)”是一个指向函数的指针,其名称为func,并且该指针指向的函数必须带有2个参数,其类型必须为int并返回一个int。 请注意不要忽略* punc周围的括号,否则它将在您编写“(int *)func(int,int)”时解释,这不再是指针。