2017-12-14 8 views
1

foo(int bar[],int type)に何千もの呼び出しがある既存のコードベースがあります。この関数では多くの構造体が作成されます(x[i].bar=bar[i]x[i].type=type)。
ここでは、それぞれが異なるタイプのものを用意する必要がある場合があります。x従ってfoo(int bar[], int type[])x[i].bar=bar[i]x[i].type=type[i]につながります。C++ Have関数テンプレートを使用してint型とint []型を受け入れる

私は現在、オーバーロードとして実装していますが、多くのコピー貼り付けコードが発生します。テンプレートを使ってこれを行う方法はありますか?

+0

は本当にこの問題を解決するテンプレートですか?あなたはまだ(おそらく)専門化が必要ですが、複製されたコードの一部を独自の機能でリファクタリングできませんか? – tkausl

+0

この場合、テンプレートは本当に必要ありません。 –

答えて

1

第3の機能を作成することができます。これは2つの機能の「一般化」です。両方の "フレーバー"のパラメータを受け取る必要があります。どちらのフレーバーを指定するかを指定します。

void foo_internal(int bar[], int type[], int default_type) 
{ 
    ... 
    x[i].bar = bar[i]; 
    x[i].type = (type == nullptr) ? default_type : type[i]; 
    ... 
} 

、あなたのオーバーロードの両方からそれを呼び出す、そこにすべてのあなたの長いコードを入れてください:

void foo(int bar[], int type[]) 
{ 
    foo_internal(bar, type, 0); 
} 

void foo(int bar[], int type) 
{ 
    foo_internal(bar, nullptr, type); 
} 
0

は、テンプレート機能を使用すると、intとしてタイプを使用するか、一般的な方法で[] intに管理すればどのようにこの

template<typename T> 
void foo(int bar[],T type){ 
... 
} 

のようなものになりますので、テンプレートは、あなたの問題を解決できると思いませんか?この

ような何かをやって

は、代わりにあなたがfooというFOOが使用すること(int型のバー[]、int型)を作るために、あなたのコードをリファクタリング可能性(int型のバーは[]、int型[]型)

void foo(int bar[],int type) 
{ 
    ... 
} 

void foo(int bar[],int[] type) 
{ 
    ... 
    foo(bar,type[i]); 
    ... 
} 

このように、コードを複製しないでください。

関連する問題