【问题标题】:Terminology surrounding functors围绕函子的术语
【发布时间】:2016-07-02 18:07:17
【问题描述】:

让我们来一个简单的仿函数

class LessThan {
public:
    explicit LessThan (int in ) : val(in) {}
    bool operator() (int param) const {
        return param < val;
    }
private:
    int val;
};

例如,我可以像这样使用 -

vector<int> myVector = factory();
size_t count = count_if(begin(myVector), end(myVector), LessThan(10));

我对仿函数术语的理解是,LessThan 类是一个仿函数。即它是一个类型,而不是一个对象。即它是抽象的,而不是具体的。

那么,我们怎么称呼LessThan(10)?在这里,我们通过实例化 LessThan 仿函数类型来创建一个对象。那么,我们称它为仿函数对象吗?但是,函子是函数对象。那么,LessThan(10) 是一个函数对象对象??

这不是很荒谬吗?

【问题讨论】:

  • 对象类型。或者更确切地说,它们是类型的实例。用户定义的类是类型,当您实例化它们时,您将获得该类型的对象。
  • @JesperJuhl 对于int a,...int 是一个类型,a 是一个对象。因此两者是不同的。
  • 如果有帮助,请这样想:LessThan 是一个函数对象类型LessThan(10) 是一个函数对象

标签: c++ functor function-object


【解决方案1】:

函数对象的术语与常规对象的术语相同:您的函子LessThan(10) 有一个类型,即class LessThan

请注意,您的仿函数是一个函数(即“小于”)及其参数之一(即int val)的组合。通过函子组合也可以达到同样的效果:

auto f = bind(less<int>(), _1, 10); // f is LessThan(10)

Demo.

【讨论】:

  • @typetraitor 没错。很多仿函数类型代表纯函数,因此没有状态(例如std::lessstd::plus 等)这使得类型和对象更容易混淆,因为类型的所有对象本质上都是相同的.
猜你喜欢
  • 2015-04-18
  • 2013-07-10
  • 1970-01-01
  • 2016-05-20
  • 2011-12-05
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多