2011-05-24 105 views
0

我有一個總和,例如:C++通過運營商循環

x + y 

我也想在相同的兩個變量進行減法,乘法和除法:

x - y 
x * y 
x/y 

什麼的最佳方式輪流通過所有四個運營商?

我知道這很容易做功能性編程語言,但在C++我不確定。

在此先感謝。

+8

「最佳」在什麼意義? – 2011-05-24 11:33:26

+0

這實際上取決於你打算如何處理結果。 – Vache 2011-05-24 11:33:51

+4

如圖所示寫出四個表達式當然是最佳方式;顯然你有一些其他的限制。 – 2011-05-24 11:34:17

回答

4

除了明顯的只是一個想法 「寫出來」:

int add(int l, int r){ 
    return l + r; 
} 

int sub(int l, int r){ 
    return l - r; 
} 

int mul(int l, int r){ 
    return l * r; 
} 

int div(int l, int r){ 
    return l/r; 
} 

int main(){ 
    typedef int (*op)(int,int); 
    op ops[4] = {add, sub, mul, div}; 

    int a = 10, b = 5; 
    for(int i=0; i < 4; ++i){ 
    ops[i](a,b); 
    } 
} 

Example at Ideone

+0

這看起來並不「最佳」。 – 2011-05-24 11:40:08

+0

@Kirill:果然,「最佳」方法就是將它們寫出4行。但這是「自行車」,因爲我會實施它。 :) – Xeo 2011-05-24 11:42:25

+0

如果數學函數聲明爲內聯,那麼它*可能會更優化。編譯器仍然保留不內聯的權利。 – 2011-05-24 16:49:57

1

如果運算符是用戶定義的,則當指針指向函數(成員)時,它們可能會被傳遞。對於基本類型,您可能需要編寫Xeo所示的包裝器。

你也可以接受一個std :: binary_function並使用std :: plus等等。

這使得在std :: function和lambda的C++ 0X中變得更容易。

但顯然,更準確地知道你想達到什麼將會有所幫助。

0

或許這是它怎麼會看起來像(類似於函數式編程語言):

template<typename T> 
std::vector<T> do_ops(const T& a, const T& b) 
{ 
    std::vector<T> result; 
    result.push_back(a + b); 
    result.push_back(a - b); 
    result.push_back(a * b); 
    result.push_back(a/b); 
    return result; 
} 

int main() 
{ 
    std::vector<int> res = do_ops(10, 5); 
}