问题标签 [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 回答
17549 浏览

c++ - 为 STL 排序算法定义 < - 运算符重载、仿函数或独立函数?

我有一个 stl::list 包含 Widget 类对象。它们需要根据 Widget 类中的两个成员进行排序。

为了使排序工作,必须定义一个比较两个 Widget 对象的小于比较器。似乎有无数种方法可以做到这一点。据我所知,一个人可以:

一种。在类中定义一个比较运算符重载:

湾。定义一个带有两个 Widget 的独立函数:

然后让 Widget 类成为它的朋友:

C。定义一个仿函数,然后在调用排序函数时将其作为参数包含在内:

有人知道哪种方法更好吗?特别是我很想知道我应该做 1 还是 2。我搜索了 Scott Meyer 的《Effective STL》一书,但不幸的是,它对此没有什么可说的。

感谢你的回复。

0 投票
0 回答
442 浏览

c++ - VS2010 中函子(副本、分配)的不同行为(与 VS2005 相比)

当从 VS2005 迁移到 VS2010 时,我们注意到性能下降,这似乎是由额外的仿函数副本引起的。

下面的代码说明了这个问题。必须有一个值本身是一个集合的映射。在地图和集合上,我们定义了一个比较函子(在示例中是模板化的)。

如果我用 VS2005 编译这段代码,我会得到以下输出:

如果我用 VS2010 编译它,我会得到以下输出:

第一条语句(构建地图)的输出是相同的。

第二条语句的输出(在地图中创建第一个元素并获取对它的引用)在 VS2010 案例中要大得多:

  • 仿函数的构造函数:10 次 vs. 8 次
  • 函子的赋值:2次vs.0次
  • 函子的析构函数:10 次 vs. 8 次

我的问题是:

  • 为什么 STL 复制函子?为集合的每个实例化构造一次还不够吗?
  • 为什么在 VS2010 案例中构造的函子比在 VS2005 案例中更多?(没有检查VS2008)
  • 为什么它在VS2010中分配了两次而不是在VS2005中?
  • 有什么技巧可以避免仿函数的复制吗?

我在防止不必要的 C++ 仿函数对象副本中看到了一个类似的问题,但我不确定这是同一个问题。

0 投票
1 回答
1523 浏览

c++ - 创建绑定参数的函子的增强方法是什么

我需要一个函数指针,它接受两个参数并返回一个字符串。

我想传递一个适配器,该适配器包装一个接受一个参数的函数,并返回字符串(即丢弃其中一个参数)。

我可以轻松构建自己的适配器,它接受 2 个参数,调用包装函数,只传递一个参数。

但是我宁愿有一种简单的方法来动态创建适配器,如果在 C++/boost 中有一种简单的方法可以做到这一点?

这里有一些细节可以使这更具体:

显然,我可以提供一个成员来调整 GetRowText 以接受两个参数,并且只将第一个参数传递给 GetRowText() 本身。

但是是否已经有一个增强绑定器/适配器可以让我这样做?

0 投票
6 回答
1310 浏览

c++ - 我可以使用私有嵌套结构编写仿函数吗?

给定这个类:

这里的想法是fooList可以由Foo 结构中的一个key1或一个来索引。key2我正在尝试编写要传递给的函子,以便我可以按每个键std::find_if查找项目。fooList但我无法让它们编译,因为Foo在类中是私有的(它不是 C 接口的一部分)。 有没有办法在不暴露Foo于世界其他地方的情况下做到这一点?

这是一个无法编译的代码示例,因为Foo在我的类中是私有的:

0 投票
4 回答
1475 浏览

c++ - 模板函子不能推断引用类型

我有一个函子 f,它接受一个函数 func 和一个与 func 类型相同的参数 t。由于编译错误(没有匹配的调用函数),我无法将 g 传递给 f f(int&, void (&)(int&))。如果 g 将采用非引用参数 g(int s),则编译完成。或者如果我手动指定模板参数f<int&>(i, g),编译也会完成。

我怎样才能得到扣除工作?

0 投票
3 回答
570 浏览

c++ - 将匿名临时函数对象传递给模板化构造函数的问题

我正在尝试附加要在销毁模板化类时调用的函数对象。但是,我似乎无法将函数对象作为临时对象传递。我得到的警告是(如果注释行xi.data = 5;):

如果我尝试使用构造的对象,则会收到编译错误消息:

对于这段冗长的代码,我深表歉意,但我认为所有组件都需要可见才能评估情况。

我尝试这样做的原因是,我可以“以某种方式”将函数对象类型与对象附加在一起,而无需在类中保留函数对象本身的实例。因此,当我创建 的对象时class X,我不必在class writer其中保留一个对象,而只需一个指向Base<T>(我不确定我是否需要<T>这里,但现在它在那里)的指针。

问题是我似乎必须创建一个对象,writer然后将其传递给构造函数,X而不是像这样调用它X<int> xi(writer();

我可能在这里遗漏了一些完全愚蠢和明显的东西,有什么建议吗?

0 投票
2 回答
615 浏览

scala - 如何在 Scala 中将对象用作模块/函子?

我想将对象实例用作模块/函子,或多或少如下所示:

这样我就可以为每个晶格创建一个不同的微积分实例(我将执行的操作需要晶格的最大值和最小值的信息)。我希望能够混合相同微积分的表达式,但不允许混合不同的表达式。到现在为止还挺好。我可以创建我的微积分实例,但问题是我不能在其他类中编写函数来操作它们。

例如,我正在尝试创建一个解析器来从文件中读取表达式并返回它们;我还尝试编写一个随机表达式生成器,以便在我的 ScalaCheck 测试中使用。事实证明,每次函数生成一个 Expr 对象时,我都不能在函数之外使用它。即使我创建了 Calculus 实例并将其作为参数传递给将生成 Expr 对象的函数,该函数的返回也不会被识别为与在函数外部创建的对象的类型相同。

也许我的英语不够清楚,让我尝试一个我想做的玩具示例(不是真正的 ScalaCheck 生成器,但足够接近)。

现在,如果我尝试编译上面的代码,我会得到很多

如果我尝试执行以下操作,也会发生同样的情况:

请注意,生成器本身并不重要,但我需要在系统的其余部分上做很多类似的事情(即创建和操作微积分实例表达式)。

难道我做错了什么?有可能做我想做的事吗?

非常需要和赞赏有关此问题的帮助。提前非常感谢。


在收到 Apocalisp 的回答并尝试之后。

非常感谢您的回答,但仍然存在一些问题。建议的解决方案是将函数的签名更改为:

我更改了所有相关函数的签名:getRndExpr、getRndVal 和 getRndVar。而且我在调用这些函数的任何地方都收到相同的错误消息,并收到以下错误消息:

由于编译器似乎无法找出正确的类型,我将所有函数调用更改为如下所示:

在此之后,在前 2 个函数调用(genRndVal 和 genRndVar)中没有编译错误,但在接下来的 3 个调用(对 genRndExpr 的递归调用)中,函数的返回用于构建一个新的 Expr 对象我得到了以下错误:

所以,再一次,我被困住了。任何帮助将不胜感激。

0 投票
4 回答
2319 浏览

c++ - 从 trait 获取 const 或非 const 引用类型

我正在编写一个仿函数 F,它采用 void (*func)(T) 类型的函数和 func 的参数 arg。

然后仿函数 F 用 arg 调用 func。我希望 F 不要复制 arg,只是将其作为参考传递。但是我不能简单地写“void F(void (*func)(T), T&)”,因为 T 可能是一个引用。所以我正在尝试编写一个特征,它允许获得正确的 T 引用类型:

我想出了这样的事情:

例如,这不适用于

给出错误:在传递 'void F(void (*)(T), typename type_op::valid_ref_type) [with T =整数]'</p>

如何让这个特性发挥作用?

0 投票
3 回答
1534 浏览

c++ - 有没有标准的删除函子?

我正在寻找一个删除其参数的函子:

有这样的std东西tr1boost

0 投票
1 回答
299 浏览

c++ - C++结构排序错误

我正在尝试在 C++ 中对自定义结构的向量进行排序

用一个简单的函子

尝试时:

它给了我异常“无效的运算符<”

这个错误是什么意思?

谢谢