C++用循环重复代码

Jos*_*ose 1 c++ macros performance loops overloading

我不确定这是不是一个愚蠢的问题,所以如果它是拍我!

我经常遇到这种"困境".我在C++中说过两个重载函数

说我们有两个F的重载(下面只是一个伪代码)

void F(A a, .../*some other parameters*/)
{ 
  //some code part
  //loop Starts here
  G1(a,.../* some other parameter*/)
  //loop ends here
  //some code part
}


void F(B b, .../*some other parameters*/)
{
  //some code part
  //loop Starts here
  G2(b,.../* some other parameter*/)
  //loop ends here
  //some code part
}
Run Code Online (Sandbox Code Playgroud)

其中AB是不同类型,G1G2是做不同事物的不同功能.除了G1G2线之外,重载的代码部分是相同的,并且它们有时非常长且广泛.现在问题是..如何更有效地编写代码.当然,我不想重复代码(即使它很容易做到这一点,因为它只是一个复制粘贴例程).一位朋友建议宏......但那看起来很脏.这很简单,因为如果我现在知道它是非常愚蠢的.将不胜感激任何建议/帮助.

编辑:对不起那些想要代码示例的人.这个问题实际上是抽象的,因为我遇到了不同的"相似"情况,我问自己如何使代码更短/更清洁.在大多数情况下代码很长,否则我不会在第一时间问这个问题.正如KilianDS指出的那样,确保函数本身不是很长也是很好的.但有时候这是不可避免的.在那里我遇到这样的许多情况下,循环嵌套甚至(在对方即几个循环)和年初˚F我们有一个循环的开始和结束˚F我们结束这种循环.

何塞

cod*_*ing 7

在这种情况下,防止代码重复的一种简单方法是使用模板.例如:

void G(A a,.../* some other parameter*/)
{
    G1(a,.../* some other parameter*/);
}
void G(B b,.../* some other parameter*/)
{
    G2(b,.../* some other parameter*/);
}

template <typename T>
void F(T x, .../*some other parameters*/)
{ 
  //some code part
  //loop Starts here
  G(x,.../* some other parameter*/)
  //loop ends here
  //some code part
}
Run Code Online (Sandbox Code Playgroud)

请注意重载G函数如何用于确定是否调用G1G2.但是,请注意,这只能防止代码重复,而不是编译的可执行文件中的重复(因为每个模板实例化都会创建自己的代码).

根据周围的架构,可能还有许多其他可行的选项(例如虚拟方法而不是G1/G2调用,函数指针,lambda函数,如果你有C++ 11 ...)