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 に答える