问题标签 [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.
c++ - 为 STL 排序算法定义 < - 运算符重载、仿函数或独立函数?
我有一个 stl::list 包含 Widget 类对象。它们需要根据 Widget 类中的两个成员进行排序。
为了使排序工作,必须定义一个比较两个 Widget 对象的小于比较器。似乎有无数种方法可以做到这一点。据我所知,一个人可以:
一种。在类中定义一个比较运算符重载:
湾。定义一个带有两个 Widget 的独立函数:
然后让 Widget 类成为它的朋友:
C。定义一个仿函数,然后在调用排序函数时将其作为参数包含在内:
有人知道哪种方法更好吗?特别是我很想知道我应该做 1 还是 2。我搜索了 Scott Meyer 的《Effective STL》一书,但不幸的是,它对此没有什么可说的。
感谢你的回复。
c++ - VS2010 中函子(副本、分配)的不同行为(与 VS2005 相比)
当从 VS2005 迁移到 VS2010 时,我们注意到性能下降,这似乎是由额外的仿函数副本引起的。
下面的代码说明了这个问题。必须有一个值本身是一个集合的映射。在地图和集合上,我们定义了一个比较函子(在示例中是模板化的)。
如果我用 VS2005 编译这段代码,我会得到以下输出:
如果我用 VS2010 编译它,我会得到以下输出:
第一条语句(构建地图)的输出是相同的。
第二条语句的输出(在地图中创建第一个元素并获取对它的引用)在 VS2010 案例中要大得多:
- 仿函数的构造函数:10 次 vs. 8 次
- 函子的赋值:2次vs.0次
- 函子的析构函数:10 次 vs. 8 次
我的问题是:
- 为什么 STL 复制函子?为集合的每个实例化构造一次还不够吗?
- 为什么在 VS2010 案例中构造的函子比在 VS2005 案例中更多?(没有检查VS2008)
- 为什么它在VS2010中分配了两次而不是在VS2005中?
- 有什么技巧可以避免仿函数的复制吗?
我在防止不必要的 C++ 仿函数对象副本中看到了一个类似的问题,但我不确定这是同一个问题。
c++ - 创建绑定参数的函子的增强方法是什么
我需要一个函数指针,它接受两个参数并返回一个字符串。
我想传递一个适配器,该适配器包装一个接受一个参数的函数,并返回字符串(即丢弃其中一个参数)。
我可以轻松构建自己的适配器,它接受 2 个参数,调用包装函数,只传递一个参数。
但是我宁愿有一种简单的方法来动态创建适配器,如果在 C++/boost 中有一种简单的方法可以做到这一点?
这里有一些细节可以使这更具体:
显然,我可以提供一个成员来调整 GetRowText 以接受两个参数,并且只将第一个参数传递给 GetRowText() 本身。
但是是否已经有一个增强绑定器/适配器可以让我这样做?
c++ - 我可以使用私有嵌套结构编写仿函数吗?
给定这个类:
这里的想法是fooList
可以由Foo 结构中的一个key1
或一个来索引。key2
我正在尝试编写要传递给的函子,以便我可以按每个键std::find_if
查找项目。fooList
但我无法让它们编译,因为Foo
在类中是私有的(它不是 C 接口的一部分)。 有没有办法在不暴露Foo
于世界其他地方的情况下做到这一点?
这是一个无法编译的代码示例,因为Foo
在我的类中是私有的:
c++ - 模板函子不能推断引用类型
我有一个函子 f,它接受一个函数 func 和一个与 func 类型相同的参数 t。由于编译错误(没有匹配的调用函数),我无法将 g 传递给 f f(int&, void (&)(int&))
。如果 g 将采用非引用参数 g(int s),则编译完成。或者如果我手动指定模板参数f<int&>(i, g)
,编译也会完成。
我怎样才能得到扣除工作?
c++ - 将匿名临时函数对象传递给模板化构造函数的问题
我正在尝试附加要在销毁模板化类时调用的函数对象。但是,我似乎无法将函数对象作为临时对象传递。我得到的警告是(如果注释行xi.data = 5;
):
如果我尝试使用构造的对象,则会收到编译错误消息:
对于这段冗长的代码,我深表歉意,但我认为所有组件都需要可见才能评估情况。
我尝试这样做的原因是,我可以“以某种方式”将函数对象类型与对象附加在一起,而无需在类中保留函数对象本身的实例。因此,当我创建 的对象时class X
,我不必在class writer
其中保留一个对象,而只需一个指向Base<T>
(我不确定我是否需要<T>
这里,但现在它在那里)的指针。
问题是我似乎必须创建一个对象,writer
然后将其传递给构造函数,X
而不是像这样调用它X<int> xi(writer();
我可能在这里遗漏了一些完全愚蠢和明显的东西,有什么建议吗?
scala - 如何在 Scala 中将对象用作模块/函子?
我想将对象实例用作模块/函子,或多或少如下所示:
这样我就可以为每个晶格创建一个不同的微积分实例(我将执行的操作需要晶格的最大值和最小值的信息)。我希望能够混合相同微积分的表达式,但不允许混合不同的表达式。到现在为止还挺好。我可以创建我的微积分实例,但问题是我不能在其他类中编写函数来操作它们。
例如,我正在尝试创建一个解析器来从文件中读取表达式并返回它们;我还尝试编写一个随机表达式生成器,以便在我的 ScalaCheck 测试中使用。事实证明,每次函数生成一个 Expr 对象时,我都不能在函数之外使用它。即使我创建了 Calculus 实例并将其作为参数传递给将生成 Expr 对象的函数,该函数的返回也不会被识别为与在函数外部创建的对象的类型相同。
也许我的英语不够清楚,让我尝试一个我想做的玩具示例(不是真正的 ScalaCheck 生成器,但足够接近)。
现在,如果我尝试编译上面的代码,我会得到很多
如果我尝试执行以下操作,也会发生同样的情况:
请注意,生成器本身并不重要,但我需要在系统的其余部分上做很多类似的事情(即创建和操作微积分实例表达式)。
难道我做错了什么?有可能做我想做的事吗?
非常需要和赞赏有关此问题的帮助。提前非常感谢。
在收到 Apocalisp 的回答并尝试之后。
非常感谢您的回答,但仍然存在一些问题。建议的解决方案是将函数的签名更改为:
我更改了所有相关函数的签名:getRndExpr、getRndVal 和 getRndVar。而且我在调用这些函数的任何地方都收到相同的错误消息,并收到以下错误消息:
由于编译器似乎无法找出正确的类型,我将所有函数调用更改为如下所示:
在此之后,在前 2 个函数调用(genRndVal 和 genRndVar)中没有编译错误,但在接下来的 3 个调用(对 genRndExpr 的递归调用)中,函数的返回用于构建一个新的 Expr 对象我得到了以下错误:
所以,再一次,我被困住了。任何帮助将不胜感激。
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>
如何让这个特性发挥作用?
c++ - 有没有标准的删除函子?
我正在寻找一个删除其参数的函子:
有这样的std
东西tr1
吗boost
?
c++ - C++结构排序错误
我正在尝试在 C++ 中对自定义结构的向量进行排序
用一个简单的函子
尝试时:
它给了我异常“无效的运算符<”
这个错误是什么意思?
谢谢