什么是关于函数对象的para

时间:2013-12-10 10:04:10

标签: c++ stl

我在一本书中看到了这个陈述,我不明白。句子是:&#34; <function>中的模板可以帮助您构造定义operator()的对象。这些对象称为函数对象,可用于代替许多地方的函数指针&#34;。

请告诉我operator()是什么,我也希望在此背景下了解&#34; 功能对象&#34; 的含义。

1 个答案:

答案 0 :(得分:2)

函数对象(通常称为仿函数)只是一个可以像函数一样运行的对象。例如,如果您想要一个跟踪调用之间某事的函数,这很有用。

要使用类似函数的对象,您需要能够调用它,如下所示:

reallyAnObject(some, args);

您可以通过为您的班级重载operator()来实现这一目标。

<functional>标题提供了各种有用的工具来帮助您创建函数对象。

这是一个非常简单的例子:

struct Functor {
    void operator() (int i)
    {
        std::cout << "Really an object. Called with " << i << '\n';
    }
};

int main() {
    Functor f;
    // prints "Really an object. Called with 1"
    f(1);
}

现在我想一个更有用的功能可能是打印一大堆数字,所有这些都在同一个流中(尽管仍然非常人为):

struct Printer {
    std::ostream& os_;
    Printer (std::ostream& os) : os_(os) {}

    void operator() (int i)
    {
        os << i;
    }
};

int main() {
    // prints "12" to stdout
    Printer p {std::cout};
    p(1);
    p(2);

    // prints "34" to stderr
    Printer p2 {std::cerr};
    p2(3);
    p2(4);
}

更复杂的示例通常可用于与标准<algorithm>进行交互。

<functional>标题提供了许多人们经常自己编写的有用内容,例如std::plusstd::greaterstd::unary_negate。它还提供std::functionstd::bind,但我现在远离那些,它们有点棘手。