2014-03-28 45 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"; 
} 

,它仍然工作得最佳。

相关问题