在C++中何时应该使用函数而不是仿函数?

8

Functors(函数对象)似乎更有效率,因为编译器可以更容易地将它们内联,并且它们在参数化方面表现更好。那么,何时应该使用普通的函数而不是函数对象呢?


3
可能是为什么使用函数对象而不是函数?的重复。 - Manav Dubey
1
你介意澄清一下吗?另外,我并不是指替代任何内置/STL函数,我是说为什么我要编写一个函数而不是将其作为一个函数对象。 - nilcit
1
嗯,正如我的假设例子所示,有很多事情是函数完全可以很好地处理的。 - Kerrek SB
1
我认为函数更简单易用。如果您不需要functor提供的任何附加功能,请编写一个函数。要使用functor,您必须为每个functor定义一个新类。 - Barmar
3
严谨地说,你如何定义一个没有使用函数的函子类? - Kerrek SB
显示剩余3条评论
1个回答

17

函数支持分布式重载,而函数对象则不行。您必须在函数对象内定义所有的重载;您可以在任何地方添加新的函数重载。

函数支持ADL(参数相关查找),允许在与参数类型相关联的命名空间中进行重载。而函数对象不支持。

函数指针是一种类型擦除后的状态无关函数对象,它是一个POD(普通数据类型),正如无状态lambda表达式转换为函数指针一样。这些特性(POD、无状态、类型擦除)非常有用。


1
非常感谢,这正是我在寻找的答案类型。 - nilcit
函数指针并不是类型擦除的,实际上需要一些额外的工作来擦除类成员函数指针的类型。请参见此处:https://godbolt.org/g/OS0u45 - 1stCLord
2
@TheSombreroKid 首先,我谈论的是函数指针,而不是成员函数指针(它们是不同类型的指针)。将[]{}转换为void(*)()--这是一种"类型擦除",因为我们忘记了我们正在做什么确切的操作,只记得"我们可以用()调用它。它能够"擦除"的内容非常有限。我确实是指"有点"而不是"实际上"。为了更清晰明了,进行了编辑。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接