2014-03-28 75 views
9

我想用一個參數作爲參數,該參數接受std :: greater <int>或std :: less <int>作爲參數。不過,我堅持使用參數的語法。使用std :: greater或std :: less作爲參數的參數

這是我試過的格式:這不*工作,雖然

myFunction(int a, int b, bool *comp(int, int)) { … } 
… 
std::greater<int> bigger; 
myFunction(2, 3, bigger); 

,我懷疑的第三個參數就是完全錯誤的。它應該是什麼?

*不能轉換 '的std ::更大的' 到「布爾*(*)(INT,INT)

+2

pass'std :: greater ()'而不是 –

+0

謝謝。我更新了我的問題,以傳遞更大的實例而不是類。錯誤是一樣的;第一次我沒有仔細複製我的代碼。我的錯。 – Qaz

+1

順便說一下,你的參數是一個函數(在上下文中轉換爲視線中的函數指針),取兩個'int'並返回一個'bool *'。 – chris

回答

10

功能採取了比較通常是通過模板來實現:

template <typename Comparator> 
myFunction(int a, int b, Comparator comp) { … } 

,但你也可以使用std::function實現它:

myFunction(int a, int b, std::function<bool (int, int)>) { … } 

第一個版本公開頭中的代碼,但通常會更好。 至於第二個版本,您可以隱藏.cpp文件中的實現 ,但由於不可能內嵌 比較器調用,您將失去一些性能。

2

使用模板:

template<class Callable> 
myFunction(int a, int b, Callable f); 
7

所以這裏的訣竅是std::lessstd::greater實際上是可以輕易構造的無狀態函數對象。但是他們不支持強制轉換爲函數指針。

高效的選擇是任一(A)經由template參數採取比較並實施報頭的代碼:

template<typename C> void myFunc(int a, int b, C comp) 

這意味着你必須實現它在頭文件中,或(B)類型通過std::function< bool(int, int) >刪除函數對象:(?!也許顯著簡介)

void myFunc(int a, int b, std::function< bool(int, int) > comp) 

具有一定的成本(堆分配是通過無狀態的std小目標優化避免以下/以上,但它往往花費virtual函數調用不管,也可以阻塞內聯)。

或(c)編寫一些代碼,可以讓你把一個無狀態的仿函數,並把它變成一個函數指針:

template<typename T> 
using Type = T; 
template<typename StatelessFunctor> 
struct function_ptr_of_stateless_t { 
    template<typename R, typename... Args> 
    operator Type<R(Args...)>*() const { 
    return [](Args... args)->R { 
    return StatelessFunctor()(std::forward<Args>(args)...); 
    }; 
    } 
}; 
template<typename StatelessFunctor> 
function_ptr_of_stateless_t<StatelessFunctor> as_function_ptr() { 
    return {}; 
} 

bool myFunction(int a, int b, bool(*comp)(int, int)) { return comp(a,b); } 
int main() { 
    std::cout << myFunction(3,7, as_function_ptr<std::less<int>>()) << "\n"; 
} 

其中template功能as_function_ptr需要你的無國籍仿函數的類型,並創建一個扔掉類型,可以將它轉換爲任何兼容的函數指針類型。

這具有適度比std::function溶液更少的開銷,因爲在函數指針呼叫往往比在virtual方法更快,並且除了一些編譯器(如GCC)處於內聯函數指針相當不錯,即使是從一個編輯單位到另一個。

作爲獎勵,在C++ 14可以使用:

int main() { 
    std::cout << myFunction(3,7, as_function_ptr<std::less<>>()) << "\n"; 
} 

,它仍然工作得最佳。

相關問題