2012-04-10 2 views
2

У меня есть код, как:C++ лучший способ справиться с функцией перегрузки

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 строк кода? Должен ли я использовать функцию перегрузки в этом случае?



EDIT:

Что делать, если код не так легко отделить? Нравится:

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 
    } 
} 
+0

Почему вы не ставите общие 30 строк в отдельную функцию? – Asha

+0

Поместите 30 строк общего кода в отдельную функцию, которая вызывается функциями 'Foo'? –

ответ

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 
} 

Примечание: вам придется использовать специализированную специализацию как не все conta имеют один и тот же способ ввода (или доступа) (например, вектор, список: push_back; карта: insert)

UPDATE: после OP добавил больше коды на вопрос:

Если единственное различие заключается в обработке контейнеров, но «дух» обработка контейнеров очень похож, вы можете создать (шаблона) для контейнеров и передать оболочку в общую функцию: различия будут учитываться в разных реализациях оберток.

6

Рефакторинг 30 строк в вспомогательную функцию, которую вы вызываете в обеих перегрузках.

Редактировать: Если код отличается от того, что вы пытаетесь его разделить, то в чем проблема?

0

Возможно, большинство распространенных вещей можно обрабатывать итераторами?

Смежные вопросы