2013-07-25 60 views
1

功能函數相對於函數的優勢據說是他們的keep a state。 讓我們說在我的問題這不是一個相關的功能。函數或仿函數作爲模板參數? (如果它不需要狀態)

當我定義一個模板化的函數/類時,是否有任何規則來選擇將函數還是函數作爲模板參數會更好?或者我可以基本上做同樣的事情,這也取決於我的口味嗎?

(相關問題:Functor vs template parameters

編輯:
我的問題是部分答案(用戶端)在這裏:Reason to use this stateless class with a function call operator vs a c style function?

回答

5

既然要定義模板功能,不徵收對用戶的選擇(如果它不是模板,我建議你將它作爲一個模板出於這個原因)。

請注意,接口有兩面。你定義的函數可以選擇簽名,但它不知道調用者(函數的用戶)是否想要保持狀態。如果你選擇了一個函數指針,那麼被定義的函數會對用戶強加一個要求,從而降低靈活性。

請記住,C++是一個非常好的語言,因爲它允許您在很多情況下提供很少或沒有成本的抽象。例如,如果您選擇使用像普通的方法:

template <typename Iterator, typename Pred> 
std::find_if(Iterator first, Iterator last, Pred p); 

,允許符合國家函子,它仍然可以用普通的功能使用沒有任何鬆動的表現。通用方法不會比手動手動解決方案更糟糕。

+3

@Antonio:我想你誤解了它。您可以在標準庫的大多數算法中使用函數指針。就像在上面的例子中,沒有任何限制你傳遞一個自由函數,它接受適當的參數並返回'bool'。更重要的是,如果您決定傳遞一個函數指針,那麼它的表現就不會比只考慮函數指針時的表現更好。請注意,在上面的代碼中,'Pred'的要求是* callable *有兩個'Iterator :: value_type',而不是* functor *實現'operator()'... –

+0

謝謝澄清! – Antonio

+0

而且,爲了完全解決我的問題:如果狀態不重要,我的用戶(通常碰巧還是我自己:))應該選擇傳遞函數還是函數,是否有任何特定的原因? – Antonio