如何避免重复

时间:2012-02-23 10:37:32

标签: c++ performance templates macros overloading

考虑以下功能

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函数具有优化的巨大体型, 几行是相同的:if(a [i]&gt; 0) 我想添加扩展此函数,以便在添加参数时,这些行应更改为if(a [i]&lt; th) 当我重载函数时,数百行重复(变得难以维护),所以我不想要这个。此外,我不能将身体划分为函数,因为“行”出现在太多的内循环中。

第一个想法:

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

由于将额外的if引入内部循环的性能开销,我无法做到这一点。 有没有办法有效和清楚地解决它,也许使用模板或宏?

2 个答案:

答案 0 :(得分:6)

您可以尝试将其设为一个采用任意谓词的函数模板。如果谓词很简单,就像你的情况一样,你可以依靠编译器来内联它,这样就不会有效率的损失。您应该分析您的应用程序以验证它。代码可能如下所示:

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
}

Pre-C ++ 11你必须将函子或函数指针作为谓词传递,在C ++ 11中你可以使用lambdas:

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

答案 1 :(得分:2)

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

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>(...)