所以这里的诀窍是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