函数调用运算符

7

1
@Troubadour:很可能,但是不知道operator()用途的人不太可能知道什么是函数对象,也不会寻找那个问题。 - Gorpik
@Gorpik:是的,但我认为即使最基本的搜索也会揭示operator()和函数对象之间的关系。 - Troubadour
另一方面:https://dev59.com/_nRC5IYBdhLWcg3wYP2h - Gorpik
@Gorpik:说得对,但在搜索框中键入“operator()”会去掉“()”,这很烦人,我想这是一种“卫生处理”吧 :/ - Matthieu M.
2个回答

10

这个运算符将您的对象转换为函数对象。 这里有一个很好的示例。

下一个示例演示了如何实现一个类以将其用作函数对象:

#include <iostream>

struct Multiply
{
    double operator()( const double v1, const double v2 ) const
    {
        return v1 * v2;
    }
};

int main ()
{
    const double v1 = 3.3;
    const double v2 = 2.0;

    Multiply m;

    std::cout << v1 << " * " << v2 << " = "
              << m( v1, v2 )
              << std::endl;
}

这是一个过于复杂的例子,不太好。如果你在回答中添加一个好的例子而不是链接,就点个赞吧。 - Martin York
@Martin 这样做足够好了吗?同样的效果也可以通过一个函数来实现。 - BЈовић

4
它使对象像函数一样“可调用”。不同的是,对象可以保存状态。实际上,函数可以使用静态局部变量在弱意义下实现这一点,但是那个静态局部变量对于任何线程的任何上下文中调用该函数的情况都是永久存在的。
使用对象作为函数时,状态仅是该对象的成员,并且您可以拥有同一类的其他对象,这些对象具有自己的成员变量集。
整个boost::bind(基于旧的STL绑定器)都基于这个概念。
函数具有固定的签名,但通常需要比实际传递的参数更多的参数来执行操作。

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