函数或函子作为模板参数?(如果它不需要一个州)

Ant*_*nio 1 c++ templates function-pointers functor

函数关于函数的优点据说是它们保持状态.让我们说在我的问题中这不是一个相关的功能.

当我定义一个模板化的函数/类时,是否有任何规则可以选择将函数或函子作为模板参数更好?或者我可以基本上做同样的事情,所以这取决于我的口味?

(相关问题:Functor vs模板参数)

编辑:
我的问题部分回答(对于用户方)这里:使用这个无状态类与函数调用操作符vs ac样式函数的原因?

Dav*_*eas 5

由于您正在定义模板函数,因此不要对您的用户进行选择(如果它不是模板,我会建议您为此将其设为模板).

请注意,界面有两面.您定义的函数可以选择签名,但不知道调用者(函数的用户)是否想要保持状态.如果选择了函数指针,则定义的函数会对用户施加要求,从而降低了灵活性.

请记住,C++是一种非常好的语言,它允许您在很多情况下提供很少或没有成本的抽象.例如,如果您选择使用通用方法,例如:

template <typename Iterator, typename Pred>
std::find_if( Iterator first, Iterator last, Pred p );
Run Code Online (Sandbox Code Playgroud)

这允许带有状态的仿函数,它仍然可以与普通函数一起使用而不会有任何松散的性能.通用方法不会比手动手工解决方案更糟糕.

  • @Antonio:我想你误会了.您可以在标准库的大多数算法中使用函数指针.如上例所示,没有什么限制你传递一个带有适当参数并返回`bool`的自由函数.更重要的是,如果您决定传递一个函数指针,那么它的性能将不会低于设计时只考虑函数指针的情况.请注意,在上面的代码中,'Pred`的要求是*callable*,带有两个`Iterator :: value_type`,而不是*functor*实现`operator()`with ... (3认同)