10

我刚刚读到有人用构造函数和谓词调用一个operator()类:

// Example
class Foo {
  public:
    Foo(Bar);
    bool operator()(Baz);
  private:
    Bar bar;
};

但是,我以前没有听说过在这种情况下使用谓词这个词。我会称这样的东西为functor。对我来说,谓词是形式逻辑领域的东西。

这提出了以下问题:

  • 这是一个常见的词Foo吗?
  • 这两个术语是否可以互换使用,或者它们的含义略有不同?
  • 或者
    • 返回类型(bool相对于其他东西)是否与它有关?
    • operator()存在呢const
4

5 回答 5

25

函子是一个术语,指的是()在表达式中支持运算符(具有零个或多个参数)的实体,即在语法上表现为函数的东西。Functor 不一定是某个具有重载的类的对象operator ()。普通函数名也是函子。尽管在某些情况下,您可以看到“函子”一词在更狭义和排他的意义上使用:只是类对象,而不是普通函数。

谓词是一种特定类型的函子:计算为布尔值的函子。它不一定是bool类型的值,而是具有“布尔”语义的任何类型的值。该类型应该可以隐式转换为bool

于 2012-08-04T03:48:05.233 回答
4

显示的类是一个实现谓词的函子。

谓词是一个布尔函数。

关于operator()不在const这里:理想情况下应该是const,是的。

于 2012-08-04T03:34:27.747 回答
2

谓词是一种特殊的函数对象。请参阅 Nicolai Josuttis 的这篇出色的专栏。去引用:

返回布尔值的函数对象是谓词。这就是几乎所有关于 STL 谓词的教程、书籍和手册所写的内容。然而,这还不是全部。

然而,不幸的是,在任何手册或 C++ 标准中都没有提到一个额外的要求:谓词应该总是为相同的值返回相同的结果。

或者,在 C++ 语言中:您应该将 operator() 声明为常量成员函数(而不是玩可变或强制类型转换的游戏)。出于同样的原因,谓词的副本应该与原始的状态相同。

原因是 STL 算法会复制函数对象,复制不应该影响应用函数对象的结果。

template<typename Arg0>
struct UnaryPredicate
:
    public std::function<bool(Arg0 const&)>
{
    bool operator()(Arg0 const& a0) const
    {
        return // your code here
    }
};

template<typename Arg0, typename Arg1>
struct BinaryPredicate
:
    public std::function<bool(Arg0 const&, Arg1 const&)>
{
    bool operator()(Arg const& a0, Arg const& a1) const
    {
        return // your code here
    }
};
于 2012-08-04T07:55:05.560 回答
2

如前所述,谓词只是用户提供的指令,用于将某些内容分析为布尔状态。所以你可以让同样的两件事做同样的事情......

struct is_odd
{
    is_odd() : count(0);
    bool operartor () (int i) const { ++count; return (i % 2) == 1; }

private
    int count;
}

和...

bool isOdd(int i) { return (i % 2) == 1; }

那么,函子有什么特别之处呢?如果您愿意,它会保持状态!这意味着虽然这两行代码做同样的事情(假设 v 是一个向量,值为 0 - 9)......

for_each(v.begin(), v.end(), isOdd); //using C-style function pointer

和...

is_odd fn = for_each(v.begin(), v.end(), is_odd); //using functor

只有使用第二个用例,您才能调用...

int calls = fn.count;

那是因为 for_each(以及其他 STL 算法函数)最后返回了它使用的函子,所以现在可以查询最终状态。

要注意的另一件很酷的事情是,在第二种情况下,我们使用的是所谓的“匿名”对象。

于 2016-04-26T19:30:24.443 回答
1

来自 MSDN:

表示定义一组条件并确定指定对象是否满足这些条件的方法。

http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx

于 2012-08-04T06:46:13.103 回答