2017-01-19 207 views
2

我想將大於(>)和小於(<)的運算符作爲參數傳遞給函數,它怎麼可能..有什麼辦法可以傳遞這些運算符作爲論據..任何人都可以幫助我。將運算符作爲參數傳遞給函數C

+2

你不能直接。您需要傳入運算符的表示(通常使用枚舉),然後將函數轉換爲正確的運算符。 – kaylum

+2

aaaaand我們有一個完全合理的問題來自新用戶 –

+0

[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)的強制性愚蠢downvote多? – Lundin

回答

1

沒有辦法通過'原始'操作符,但有辦法達到相同的結果。 最簡單的將是一個char

int func(char op, int a, int b) 
{ 
    if (op == '<') 
    { 
     return a < b; 
    } 
    else if (op == '>') 
    { 
     return a > b; 
    } 
    return -l; /* error */ 
} 

一個更復雜的解決方案將是使用函數指針到執行的操作(類似於由排序方法中使用的比較器)的功能。

1

您可以創建一個枚舉並傳遞它。 或者你可以在一個指針傳遞給這樣一個比較函數:

#include <stdio.h> 

int max(int a, int b, int (*comp)(int, int)) { 
    if (comp(a, b) < 0) { 
    return b; 
    } else { 
    return a; 
    } 
} 

int mycomp(int a, int b) { 
    return a < b ? -1 : 1; 
} 

int main() { 
    printf("%d %d\n", max(1, 2, mycomp), max(2, 1, mycomp)); 
} 
1

你可以做可怕的事情用宏,但總的來說,不,你不能做到這一點。您通常會接受兩個參數函數並將其調用,並且該函數可酌情使用><,有關示例,請參閱the sort docs。這就是說,它不是超高效的(通過一個指針調用一個函數不能被內聯,而對於像><<比較那樣的廉價操作,函數調用的開銷超過了比較工作)。使其高效要求:

  1. 代碼的多個拷貝,每個可能的操作者(經由宏可能產生)
  2. 移動到C++,並使用模板代碼與函子/ lambda表達式,可以適當地被內聯
+0

當然,從技術上講,C++模板化代碼實際上是在專門化模板時製作代碼的多個副本。但是,它只是在需要時以更安全的方式這樣做,並且它不會如此糟糕地混淆源代碼,它會稍微膨脹最終的二進制大小。 – ShadowRanger

相關問題