2

我有如下代码:

void Foo(int& a, string& b, vector<int>& c) {
... // 30 lines of code are same as another function
... // 10 lines of code to parse and assign value to vector<int>& c
}

void Foo(int& a, string& b, map<string, int>& d) {
... // 30 lines of code are same as another function
... // 10 lines of code to parse and assign value to map<string, int>& d
}

有什么办法可以避免重复这 30 行代码?在这种情况下我应该使用函数重载吗?



编辑:

如果代码不容易分离出来怎么办?像:

void Foo(int& a, string& b, vector<int>& c) {
  for() {
    if(m) ... // 30 lines of code are same as another function
    else if(n) ... // 30 lines of code are same as another function
    else if(o) ... // 30 lines of code are same as another function
    else if(p) ... // 10 lines of 'vector<int>& c' code
    else if(q) ... // 10 lines of 'vector<int>& c' code
  }
}


void Foo(int& a, string& b, map<string, int>& d) {
  for() {
    if(m) ... // 30 lines of code are same as another function
    else if(n) ... // 30 lines of code are same as another function
    else if(o) ... // 30 lines of code are same as another function
    else if(p) ... // 10 lines of 'map<string, int>& d' code
    else if(q) ... // 10 lines of 'map<string, int>& d' code
  }
}
4

3 回答 3

6

将 30 行重构为您在两个重载中调用的辅助函数。

编辑:如果代码足够不同以至于您很难将其分开,那么问题出在哪里?

于 2012-04-10T10:12:18.633 回答
4

您可以分解出通用代码:

void helper(int& a, string& b) { 
  ... // 30 lines of common code
} 

然后在函数中使用它:

void Foo(int& a, string& b, vector<int>& c) {     
  helper(a, b);
  ... // 10 lines of code to parse and assign value to vector<int>& c     
}     

void Foo(int& a, string& b, map<string, int>& d) {     
   helper(a, b);
.  .. // 10 lines of code to parse and assign value to map<string, int>& d     
}

或者,如果公共代码也包含对容器的引用,您可以使用模板:

template<template<typename T, typename Alloc> class Container>
void helper(int& a, string& b, Container& d) { 
  ... // 30 lines of common code
} 

注意:您必须使用模板特化,因为并非所有容器都具有相同的插入(或访问)方法(例如 vector、list: push_back; map: insert

更新:在 OP 添加更多代码后:

如果唯一的区别在于容器的处理,但容器处理的“精神”非常相似,您可以为容器创建(模板)包装器并将包装器传递给一个通用函数:差异将被捕获包装器的不同实现。

于 2012-04-10T10:19:09.157 回答
0

也许大多数常见的东西都可以用迭代器处理?

于 2012-04-10T10:28:56.673 回答