如何避免重复

How to avoid duplication

本文关键字:何避免      更新时间:2023-10-16

考虑以下函数

f(int a[])
{
     ///CODE
     for
      for
       if(a[i] > 0)
       //change i on some condition
     for
        //CODE
        if(a[i] > 0)
    ///CODE
}
f(int a[], int th)
{
     ///CODE
     for
      for
        if(a[i] < th)
       //change i on some condition
     for
        //CODE
        if(a[i] < th)
    ///CODE
}

所以我们有一个f函数,它有一个优化的巨大的身体,有几行是相同的:如果(a[i]>0)我想添加扩展这个函数,这样如果添加了参数,这些行应该改为if(a[I]<th)当我重载函数时,会有数百行重复(很难维护),所以我不希望这样。此外,我无法将主体划分为函数,因为"线"出现在太多的内部循环中。

第一个想法:

f(int a[], int th = -1)
{
     ///CODE
        if(th == -1)
            if(a[i] > 0)...
        else
            if(a[i] < th)...
     ///CODE
}

我不能这样做,因为在内部循环中引入额外的if会带来性能开销。有没有一种方法可以既有效又清晰地解决这个问题,也许可以使用模板或宏?

您可以尝试将其作为一个接受任意谓词的函数模板。如果谓词很简单,就像在您的情况下一样,您可能可以依靠编译器来内联它,这样就不会损失效率。您应该配置您的应用程序以验证这一点。代码可能看起来像这样:

template<class Pred>
void f(int a[], Pred pred) {
 ///CODE
 for
  for
   if(pred(a[i]))
   //change i on some condition
 for
    //CODE
    if(pred(a[i]))
///CODE
}

在C++11之前,您必须将函数或函数指针作为谓词传递,在C++11中,您可以使用lambdas:

f(data, [](int val){ return val > 0; });
f(data, [th](int val){ return val < th; });

您可以通过模板参数传递函数:

template<bool Cmp(int,int)>
void f(int a[], int th)
{
    //..
    if (Cmp(a[i],th)) {
       //...
    }
    //...
}

然后,您可以像这样使用f

bool cmp(int a, int b) { return a < b; }
f<cmp>(...)