2010-01-03 46 views
3
template<class T> 
void swap(T &a, T &b) 
{ 
    T t; 

    t = a; 
    a = b; 
    b = t; 
} 

更換我應該儘可能使我的功能儘可能通用嗎?

void swap(int &a, int &b) 
{ 
    int t; 

    t = a; 
    a = b; 
    b = t; 
} 

這是我能想出的最簡單的例子,但應該有很多其他複雜functions.Should我做如果可能的話我寫模板的所有方法?

這樣做的缺點?

謝謝。

+10

Wll,這裏有一個缺點 - std :: swap()已經存在。 – 2010-01-03 15:38:05

+0

還有什麼其他的功能? – 2010-01-03 15:39:16

回答

11

通用性具有可重用的優點。然而,寫出來的東西一般,只有當:

  1. 它並不需要更多的時間來做到這一點,不是做非通用
  2. 它沒有複雜的代碼比非通用的解決方案更多
  3. 你知道會從中受益後

然而,知道你的標準庫。您提交的案例已在STL中作爲std::swap

另外,請記住,在一般使用模板編寫代碼時,可以使用模板特化優化特殊情況。但是,當它需要性能時,總是要求它,而不是你寫的。

另外,請注意您在這裏有運行時和編譯時性能的問題。基於模板的解決方案增加了編譯時間。聯機解決方案可以但不是必須減少運行時間。

`原因「不成熟的優化和通用性是萬惡的根源」。你可以引用我的那個-_-。

3

使它們儘可能通用,因爲你可以輕鬆地製作它們。如果它真的很微不足道(例如上面的例子),那麼它不需要額外的工作,並且可能在將來爲您節省一些工作

+0

在沒有至少評論原因的情況下降低問題是不禮貌的。 – Martin 2010-01-05 10:36:42

0

使用模板始終存在缺點。它可以大大增加程序的編譯時間,並且會使編譯錯誤更難理解。

正如taldor所說,不要讓你的函數比他們需要的更具通用性。

10

只有在實際重用代碼時,可重用代碼纔可重用。所以首先自然地編寫函數。如果稍後你會遇到這樣一種情況:代碼可以重複使用並做一些調整,然後重新構造它,在重構階段,你應該考慮編寫模板函數。

4

最簡單的回答你的問題是很多人更聰明比我一直在說年:

不要寫比最低,你可以逃脫了。

0

您可以查看功能參數及其使用方式。如果所有操作都是通過重載操作符完成的,則該函數可能非常通用,並且很可能成爲模板。否則,非常特殊的類類型和函數調用的存在可能會使泛型可重用性非常成問題,並且任何最終的靈活性都應該通過多態來實現。

1

你寫的第一次交換你不應該

第二次,可能是誘人的,但有時你可以逃脫不使整個事情一團糟

第三次就應該清楚,你必須。但是這取決於它如何可能很多地方你使用一個和兩個非常耗時,因此第二次應該是

0

一個很好的決定有幾個想法:

  1. 知道了STL。已有std::swap。與其花時間儘可能使所有東西儘可能通用,花時間更熟悉STL。

  2. 不要直到你需要它:"Always implement things when you actually need them, never when you just foresee that you need them."---Ron Jeffries。如果您實際上沒有重用代碼,則您沒有編寫可重用代碼,因此您編寫了不必要的代碼。不必要的代碼開發昂貴,測試成本高,維護成本高。別忘了opportunity cost

  3. 讓事情變得簡單:「讓所有事情儘可能簡單,但並不簡單。」---阿爾伯特愛因斯坦。這是KISS

相關問題