gpt4 book ai didi

c++ - 为什么 C++ 仿函数比具有命名方法的对象更可取?

转载 作者:可可西里 更新时间:2023-11-01 18:34:47 24 4
gpt4 key购买 nike

我最近对仿函数很感兴趣,并且到处都在使用它们。然后情况出现了,我需要我的仿函数执行两个不同的操作,我考虑向我的仿函数添加另一个方法(不重载 () 运算符)。我不确定这是否是不好的做法(也许你可以告诉我),但这让我开始思考为什么我首先使用仿函数而不仅仅是对象。所以我的问题是:

重载 () 运算符有什么特别之处,还是它在语法上比使用普通的命名方法稍微更吸引人?

更新:

首先,我知道为什么仿函数可能比其他问题中解释的函数指针更可取。我想知道为什么它们比具有命名方法的对象更可取。

其次,关于我何时想使用我的仿函数的另一个可能命名的方法的示例:基本上我有两个函数,一个计算称为图分区模块化的东西 - compute_modularity(),另一个计算分区发生某些变化后的模块化增益compute_modularity_gain()。我想我可以将这些函数作为同一个仿函数的一部分传递到优化算法中,并将增益作为命名函数。我不只是将两个仿函数传递到算法中的原因是我想强制 compute_modularity_gain() 仅与 compute_modularity() 一起使用,而不是另一个仿函数例如compute_stability()(只应与 compute_stability_gain() 一起使用。换句话说,增益函数必须与其兄弟函数紧密耦合。如果有其他方法我可以强制执行此约束,然后请告诉我。

最佳答案

operator() 重载的原因是为了使仿函数具有与函数指针相同的调用语义——事实上,如果您愿意,您可以使用函数指针。

重载 operator() 而不是使用函数有几个原因——但最重要的一个是编译器很少会在使用函数指针时优化掉间接函数调用,但是它们几乎总是会优化 operator() 调用——这就是为什么 std::sort 通常胜过 std::qsort

这有一大堆复杂的原因,但真正归结为大多数(不是吗?)编译器实现了删除函数指针调用的优化,这在现代硬件上是昂贵的。

Then the situation arose where I needed my functor to perform two different operations

那么它就不再是仿函数了。要么传递两个仿函数来做你想做的,要么定义一个 template method类(class)。 (您也可以使用 mixins 在 C++ 中实现模板方法模式而无需运行时开销——但维基百科文章没有涵盖这一点)(另请注意:与 C++ 模板不同,尽管如果您去AOP 路由)

关于c++ - 为什么 C++ 仿函数比具有命名方法的对象更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com