问题标签 [functor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1735 浏览

java - 最佳 Java Functor lib:JGA、commons functor、mango 还是...?

我对在 Java 中使用仿函数(函数对象)很感兴趣。通过快速谷歌搜索,我找到了这 3 个包:

和 3,JGA 似乎它可能有最好的设计。但我怀疑这里实际使用过一个或多个包的其他人可能能够提供更多关于这些(可能还有其他)函子包的优缺点的见解。

0 投票
1 回答
340 浏览

c++ - 提升 lambda 集合大小评估

我有一个形式的功能:

这个函数做一些工作并且只在条件为真时返回。该条件已表示为函子参数,因为我想在不同的调用站点提供不同的条件。

现在,直接使用它相当简单,但它需要声明许多小的一次性函数或仿函数对象,如果可能的话,我想避免这些。我一直在研究 Boost 的 lambda 库,以寻找消除这些问题的可能方法,但我认为我缺少一些基本的东西;我只是不能让它做我想做的事。

目前让我感到难过的一个案例是:我有一个std::vector名为data;的集合。我所追求的条件是当该size()集合达到某个阈值时。那么,本质上,我希望我的condition仿函数在何时返回真data.size() >= threshold,否则返回假。但我一直无法用 lambda 语法表达它。

到目前为止,我能想到的最好的(至少可以编译,尽管它不起作用)是这样的:

在进入 时DoSomething,大小为 0——即使在运行过程中大小增加,对 的调用condition()似乎总是大小为 0。跟踪它(通过 Boost 的内部机制有点棘手),而它确实似乎在greater_equal每次condition()评估时都在调用,它似乎没有在调用size().

那么我完全搞砸了什么基本的事情?有没有一种更简单的方式来表达这种事情(同时仍然尽可能保持代码内联)?

理想情况下,我希望它尽可能接近 C# 等效代码流畅度:

0 投票
3 回答
262 浏览

c++ - 为什么这个样本有效?

当 sort_by_polar_angle() 被调用时,它是否起到了构造函数的作用?重载的operator()如何正确使用?

0 投票
5 回答
3701 浏览

c++ - g++ 拒绝了我的简单仿函数“期望一个类型,得到'xyz'”

我一直在玩 C++ 中的函子。特别是,我有一个对的向量,我想按对的第一个元素进行排序。我开始编写一个完全专业的仿函数(例如“bool MyLessThan(MyPair &lhs, MyPair &rhs)”)。然后,仅仅因为这类东西很有趣,我想尝试编写一个通用的“将 F 应用于这对的第一个元素”函子。我在下面写了,但 g++ 不喜欢它。我得到:

错误:“模板结构 Pair1stFunc2”的模板参数列表中参数 2 的类型/值不匹配错误:预期类型,得到“更少”

谁能阐明我在这里做错了什么?我知道这是一个稍微人为的例子,但我想知道发生了什么,如果只是为了改进我的 STL-fu。

0 投票
7 回答
1136 浏览

c++ - 具有任何返回类型和任何参数的派生函子

我有一个使用函子作为工作单元的课程。它在其 Run() 方法中接受对仿函数的引用。要允许此类对任何函子进行操作,所有这些函子必须派生自我的基函子类,如下所示:

这可行,但显然它将这些函子限制为具有返回 void 且不接受任何参数的运算符方法。我需要能够在我的类中接受一个函子,它可以接受任何类型的参数并返回任何东西。它显然是可行的,但我似乎无法找到一种方法来做到这一点。我曾考虑过使用模板、多重继承,但我一直受到以下事实的阻碍:需要运行此函子的类必须能够接受任何类型,因此将接受基类类型,因此不知道实际类型的函子。

任何有关查看途径的建议将不胜感激。

0 投票
4 回答
286 浏览

java - 可重用的条件/表达式类

我曾多次需要一些类来表示和操作条件(通常在 UI 中,因此用户通过组合不同的条件类型来构建查询,然后代码可以根据要查询的底层系统进行转换,例如 lucene 和D b)。我到处搜索一组可重用的类,我确信这必须在许多现有的地方使用(所有初学者的表达式语言),但找不到任何容易使用的东西。我最终自己编写了两次代码,但对不重用我确定存在的东西感到很遗憾。

典型需求是: - 多个运算符:and or 等​​ - 可变数量的操作数 - 组合条件以构建表达式 - 表达式的序列化 - 解析/格式化来自/到字符串的表达式

有人发现过类似的东西吗?

0 投票
9 回答
1083 浏览

c++ - 即使使用 new 和 delete,Functor 构造和开销也为零?

如果我有一个没有状态的仿函数类,但是我使用 new 从堆中创建它,那么典型的编译器是否足够聪明,可以完全优化创建开销?

这个问题是在制作一堆无状态函子时出现的。如果它们被分配在堆栈上,它们的 0 状态类主体是否意味着堆栈真的根本没有改变?看来它必须以防您稍后获取仿函数实例的地址。堆分配也一样。

在这种情况下,仿函数总是在它们的创建中增加一个(微不足道的,但非零的)开销。但也许编译器可以看到该地址是否被使用,如果没有,它可以消除堆栈分配。(或者,它甚至可以消除分配吗?)

但是作为临时创建的函子怎么样?

所以在上面的具体例子中,三行分别以三种不同的方式调用同一个函子。在此示例中,这些方式之间是否存在效率差异?或者编译器是否能够一直优化每一行,直到成为一个无计算的打印语句?

编辑:大多数答案说编译器永远不能内联/消除堆分配的仿函数。但这也是真的吗?大多数编译器(GCC、MS、Intel)也有链接时间优化,它们确实可以进行这种优化。(但有吗?)

0 投票
6 回答
1225 浏览

c++ - 用for_each调用容器元素成员的成员函数?

令人困惑的标题,希望一些代码可以澄清:

所以基本上我想在容器的每个元素上调用一个方法,但它实际上不是类型的方法,它是包含类型的一些方法......我知道我可以编写一个函数对象来“传递”调用但是我想调用一些方法,这会变得一团糟。

有任何想法吗?

0 投票
2 回答
711 浏览

c++ - 嵌套 C++ 模板定义

我有点滥用 C++ 模板,但我无法弄清楚一些事情。假设我有两种确实应该从基本类型继承的类型,但是出于速度原因,我无法承受虚函数开销(我已经对其进行了基准测试,而虚调用毁了我的一切!)。

首先,这是我的两个课程

在典型的 oo 设计中,Class1并且Class2会继承自IInterface并且我可以有一个看起来像这样的函数

但是我做不到,所以我做了这个

我知道这并不漂亮,因为(在编译器级别)没有任何东西可以强制执行Class1Class2实现相同的接口,但是出于速度原因,我违反了一些规则。

我想做的是在 上创建一个回调函数DoStuff,但我不知道如何使它与模板一起工作(特别是因为那里隐藏着。

例如,这现在有效

现在我知道你在问,为什么要使用Class1and Class2?好吧,处理文件和处理内存之间的根本区别是如此之大,以至于为不同类型的输入使用不同的类是有意义的(而不是仅仅重载构造函数并让它对不同的输入表现不同)。同样,我确实对此进行了基准测试,在他们自己的类中处理特殊情况比在每个函数中都有cases/ s快得多。if

所以我想做的是对初级开发人员隐藏很多这种实现,我不希望他们必须创建三个不同的重载DoStuffs 来处理不同的输入。理想情况下,我只需设置某种类型的回调,#defines他们需要做的就是创建一个名为的类并重DoStuff载运()算符并让函子完成工作。

我遇到的麻烦是,DoStuff完成这项工作的函数只是模板化,<class C>但 C 本身是模板化的<class DataType>,我无法弄清楚如何以通用方式传递所有内容。例如,我不能使用template <class C<DataType>>or template<template< class DataType> class C>。它只是不会编译。

有没有人有一个很好的技巧来使用这个嵌套的模板类进行通用回调,无论是函数还是仿函数(我不在乎)?基本上我想要一些东西,我可以编写一个不关心存储数据的类的通用函数,并让一个最常见的函数调用它,以确定要使用哪个类。

这样我可以编写一个BigSwitch函数并让其他人编写回调函数。

有任何想法吗?


编辑以澄清 Jalf:

我有两个非常相似的类,Class1它们Class2代表基本相同类型的数据,但是数据存储有很大不同。为了使其更具体,我将使用一个简单的示例:Class1是一个简单的数组,Class2看起来像一个数组,但不是存储在内存中而是存储在文件中(因为它太大而无法放入内存)。所以我现在就给他们MemArray打电话FileArray。所以假设我想要数组的总和。我可以做这样的事情

但是现在,我需要一种将真实数据加载到数组中的方法。如果它是一个基于内存的数组,我会这样做

如果它是文件格式,我会这样做

并且这两个调用都是有效的(因为编译器在编译时生成两个代码路径)

所有这些都假设我知道 DataType 是什么,但是对于基于文件的数组,我可能不知道数据类型,直到我打开文件并查询标题以了解数组中的数据类型。

所有这些都有效,但它需要编写两个重载GetX函数和一个X函数来完成我想做的所有事情。除了它调用的GetX函数之外,这些函数每次基本上都是相同的代码。X所以我希望能够写出类似的东西

这样我就可以打电话

然后当其他人想要添加一个新函数时,他们需要做的就是编写函数并调用

我只是在寻找一种方法来编写我的重载GetX函数和我的X函数,以便我可以从实际算法中抽象出输入/存储的方式。通常,这不是一个难题,只是我遇到了麻烦,因为该X函数包含一个模板参数,该参数本身是模板化的。template<class ArrayType>也有一个隐含的隐藏ArrayType<DataType>在那里。编译器对此不满意。

0 投票
6 回答
1216 浏览

c++ - 没有仿函数的 std::sort

我对 std::sort 算法有疑问。这是我的测试代码:

m_first是否可以在不使用任何独立函数或仿函数的情况下对变量上的向量进行排序?另外,请注意我没有使用 boost。