2017-07-07 23 views
1

我有2个功能彼此相似,重构2层的功能使用不同的参数,但在C几乎相同的实施

void func1(info1* ari,int l,int r) { 
    int size = sizeof_char_array(ari->field_type) ; 
    for (int i=0 ; i<size ; i++) { 
     if (ari->field_type[i] & MEMORY) { 
     mem_info* mi = (mem_info*)ari->field[i] ; 
     mi->L = l ; 
     } 
     else if ... 
     else { 
     info2* p = (info2*)ri->field[i] ; 
     func2(p,l,r); 
     } 
    } 
} 

另一个是

void func2(info2* ri,int l,int r) { 
    int size = sizeof_char_array(ri->field_type) ; 
    for (int i=0 ; i<size ; i++) { 
     if (ari->field_type[i] & MEMORY) { 
     mem_info* mi = (mem_info*)ri->field[i] ; 
     mi->L = l ; 
     } 
     else if... 
     else { 
     info2* p = (info2*)ri->field[i] ; 
     func2(p,l,r); 
     } 
    } 
} 

很容易找到的唯一区别这2个功能是info1*info2*info1info2是具有相似布局的结构。

有没有办法将这2个函数重构为一个优雅的C?

+0

请注意,你的'func1'不是递归(它调用'func2');你的'func2'是递归的(它自己调用它)。这是一个错字吗?该片段还使用'info2'和一个演员表。那真的是你想要的吗?如果是这样,功能之间有很多不同 - 远远超过要编辑的字符的表面数量。 –

+0

是的,func2自己调用。该片段使用info2。 @JonathanLeffler –

回答

3

不幸的是C没有像C++'s templates这样的机制。你可以使用宏来生成两个函数,参数化的类型:

#define DEFINE_FUNC(name, type)       \ 
    void name(type* ari, int l, int r)     \ 
    {             \ 
     int size = sizeof_char_array(ari->field_type); \ 
     for(int i = 0; i < size; i++)     \ 
     {            \ 
      if(ari->field_type[i] & MEMORY)    \ 
      {           \ 
       mem_info* mi = (mem_info*)ari->field[i]; \ 
       mi->L = l;        \ 
      }           \ 
      else if          \ 
      { /* ... */         \ 
      }           \ 
      else           \ 
      {           \ 
       info2* p = (info2*)ri->field[i];   \ 
       func2(p, l, r);       \ 
      }           \ 
     }            \ 
    } 

然后你就可以定义功能,如下使用它们:

DEFINE_FUNC(func1, info1) 
DEFINE_FUNC(func2, info2) 
#undef DEFINE_FUNC 

int main() 
{ 
    func1(some_info1, 0, 5); 
    func2(some_info2, 1, 6); 
} 
+0

如果fun1以递归方式调用自己,该怎么办? @Vittorio –

+0

@YuanWen:那么你只需要用'name(...)'来调用'func1(...)'。 –

+1

请注意,问题中的代码具有误导性。函数_both_调用'func2',而它们可能应该是递归的(所以'func1'调用'func1',但'func2'调用'func2')。 'func1'中还出现了一个'info2'的问题 - 目前还不清楚这是否正确。 –

相关问题