【问题标题】:what is this para about on function objects [duplicate]关于函数对象的这个段落是什么[重复]
【发布时间】:2013-12-27 18:52:19
【问题描述】:

我在一本书中看到了这句话,但我不明白。句子是:“<function>中的模板帮助你构造定义operator()的对象。这些对象被称为函数对象,在很多地方可以用来代替函数指针”。

请告诉我operator() 是什么,我还希望帮助我理解“函数对象”在这种情况下的含义。

【问题讨论】:

标签: c++ stl


【解决方案1】:

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

要像函数一样使用对象,您需要能够调用它,如下所示:

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);
}

更复杂的示例通常有助于与标准 &lt;algorithm&gt;s 进行交互。

&lt;functional&gt; 标头提供了许多人们经常自己编写的有用信息,例如 std::plusstd::greaterstd::unary_negate。它还提供std::functionstd::bind,但我暂时远离这些,它们有点棘手。

【讨论】:

  • 你能给我一个例子来进一步解释吗?
  • @codingisfun 已经在写了!
  • 我认为上面代码的输出将是一个真正的对象。用1调用是吗???
  • @codingisfun 正确。
  • 谢谢终于明白了。
猜你喜欢
  • 2011-10-10
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多