所以這裏的訣竅是std::less
和std::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";
}
,它仍然工作得最佳。
pass'std :: greater()'而不是 –
謝謝。我更新了我的問題,以傳遞更大的實例而不是類。錯誤是一樣的;第一次我沒有仔細複製我的代碼。我的錯。 – Qaz
順便說一下,你的參數是一個函數(在上下文中轉換爲視線中的函數指針),取兩個'int'並返回一個'bool *'。 – chris