如何避免重复
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>(...)
相关文章:
- C++避免重复声明的语法是什么
- 在没有太多条件句的情况下,我如何避免被零除
- 如何重构类层次结构以避免菱形问题
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 以下示例中如何避免代码复制?C++/库达
- Python中的for循环与C++有何不同
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 是否应该在模板化代码中完全避免const
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 避免在C++中重复子类定义
- "Inverse SFINAE"避免模棱两可的过载
- 如何避免在仅标头库中C++类/变量重定义
- Python 集合.计数器,如何避免重复查找
- 是否应避免从非常量迭代器转换为常量迭代器?
- 避免矢量中的对象切片<Base><shared_ptr>
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何避免LED在循环状态变化中闪烁?