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

时间:2013-07-25 13:02:56

标签: c++ templates function-pointers functor

仿函数在函数方面的优势据说是keep a state。 让我们说在我的问题中,这不是一个相关的功能。

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

(相关问题:Functor vs template parameters

修改
我的问题在这里得到了部分回答(对于用户方):Reason to use this stateless class with a function call operator vs a c style function?

1 个答案:

答案 0 :(得分:5)

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

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

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

template <typename Iterator, typename Pred>
std::find_if( Iterator first, Iterator last, Pred p );

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