问题标签 [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 投票
18 回答
38790 浏览

functional-programming - 在函数式编程中,什么是函子?

在阅读有关函数式编程的各种文章时,我曾多次遇到过“函子”一词,但作者通常假设读者已经理解了这个词。在网络上环顾四周,要么提供了过于技术性的描述(请参阅Wikipedia 文章),要么提供了非常模糊的描述(请参阅此ocaml-tutorial 网站上的 Functors 部分)。

有人可以定义这个术语,解释它的用途,或者提供一个如何创建和使用 Functor 的例子吗?

编辑:虽然我对这个术语背后的理论感兴趣,但我对理论的兴趣不如对概念的实现和实际使用的兴趣。

编辑2:看起来有一些交叉术语:我特别指的是函数式编程的函子,而不是C++的函数对象。

0 投票
3 回答
2831 浏览

c++ - 当传递给 std::for_each 时,仿函数可以保留值吗?

根据这个问题的第一个答案,下面的仿函数在被传递给之后应该能够保留一个值foreach(我无法struct Accumulator在示例中编译,所以构建了一个类)。

示例用法(根据示例)

_cards被实现为std::deque<Card>. 不管_cards得到多长时间,完成acc.counter后为零for_each。但是,当我在调试器中逐步执行时,我可以看到计数器在递增,那么这与acc按值传递有关吗?

0 投票
6 回答
3202 浏览

c++ - SIMD 与否 SIMD - 跨平台

我需要一些想法如何以某种方式编写一些可并行化问题的 C++ 跨平台实现,以便我可以利用 SIMD(SSE、SPU 等)(如果可用)。以及我希望能够在运行时在 SIMD 和非 SIMD 之间切换。

你会建议我如何解决这个问题? (当然我不想为所有可能的选项多次实施该问题)

我可以看到这对于 C++ 来说可能不是一件容易的事,但我相信我遗漏了一些东西。到目前为止,我的想法看起来像这样......一个类 cStream 将是单个字段的数组。使用多个 cStreams 我可以实现 SoA(数组结构)。然后使用一些 Functor,我可以伪造需要在整个 cStream 上执行的 Lambda 函数。

其中 for_each 将负责增加流的当前指针,以及使用 SIMD 和不使用 SIMD 内联函子的主体。

像这样:

请注意,如果 SIMD 已启用,则检查一次并且循环围绕主函子。

0 投票
1 回答
2455 浏览

c++ - 用于输出迭代器适配器的 C++ 函子

给定一个适合std::for_each和朋友一起使用的函子:

是否有一些标准方法可以将其转换为适合std::copy和朋友一起使用的输出迭代器?(或相反的改编)类似:

每次将值分配给迭代器时都会调用仿函数:

或者,或者:


背景:

我有一个使用输出迭代器公开集合的类:

这允许调用者访问这些项目,而无需强制他们使用特定的容器类型,也不会弄乱锁定或其他内部细节。

例如,仅获取唯一项目:

这打败了地狱:

现在我还希望能够聚合这些项目,而不是复制它们。(见这个问题)。我通常会做类似的事情:

现在我可以为相同的数据元素创建两个单独的方法,一个调用std::copy,一个调用,std::for_each但是如果能够使用迭代器或仿函数定义一个这样的方法,并且让调用者能够传递任何一个,那就太好了函子或迭代器,根据需要调整它们以适应适当的类型。

我现在正在做的是定义聚合器,使其可以用作输出迭代器或仿函数,但这会导致不必要的复杂性。

0 投票
4 回答
4632 浏览

c++ - 在 C++ 中,编译器“内联”一个函数对象意味着什么?

关于函数对象的维基百科文章中,它说这些对象在与for_each一起使用时具有性能优势,因为编译器可以“内联”它们。

我对这在这种情况下的确切含义有点模糊......或者我不好意思说的任何情况。谢谢你的帮助!

0 投票
1 回答
1545 浏览

c++ - lambda 表达式中的 C++ 模板化函子

第一部分已由 Eric 在下面的评论解决,但导致了我在水平规则之后描述的次要问题。谢谢埃里克!

我正在尝试将作为模板类的函子传递给 boost thread_group 类的 create_thread 方法以及函子的两个参数。但是我似乎无法超越我当前的编译错误。使用以下代码:

我还尝试了 typedef-ing 'type' 因为我认为我的问题可能与 Sig 模板有关,因为函子本身是模板化的。

我得到的错误是:

事先有一堆序言。

提前感谢您的帮助!


好的,我已经修改了以下 Eric 建议的代码,生成了以下代码:

但是,这会导致另一个编译错误:

似乎已将 void 定义为 result_type 它现在期望 operator() 返回一些东西。我尝试从函数中返回 result_type ,但这也产生了错误。有任何想法吗?

0 投票
7 回答
21359 浏览

c++ - 重载“函数调用”运算符有什么用?

我最近发现,在 C++ 中,您可以重载“函数调用”运算符,以一种奇怪的方式,您必须编写两对括号才能这样做:

然后以这种方式使用它:

这什么时候有用?

0 投票
3 回答
215 浏览

c++ - C++:创建 betwen-startups 相关函子列表

我创建了类似函子列表(函数指针)的东西。然后我将它们以二进制形式写入文件。问题是,仿函数 - 是一个简单的函数指针。(如果我错了,请纠正我。)但是函数的地址从一个运行到另一个不同。

那么,问题是 - 有没有办法创建始终相关的函子列表?

0 投票
3 回答
9209 浏览

f# - 你能向我解释一下 OCaml 函子吗?

可能重复:
在函数式编程中,什么是函子?

我对OCaml不太了解,我研究F#有一段时间了,很了解。

他们说 F# 缺少 OCaml 中存在的函子模型。我试图弄清楚函子到底是什么,但维基百科和教程对我帮助不大。

你能帮我解开这个谜吗?提前致谢 :)

编辑:

我已经抓住了重点,感谢所有帮助过我的人。您可以将问题作为完全重复的内容结束:在函数式编程中,什么是函子?

0 投票
2 回答
17303 浏览

c++ - Visual Studio 2010 和 std::function

我有这个代码:

目的是通过 reference_wrapper 传递函子对象,以避免无用的复制 costructor 调用。我期望以下输出:

它可以与 GCC >= 4.4.0、Visual Studio 2008 以及通过将 std::tr1 命名空间替换为 boost 来正常工作。它仅不适用于新的 Visual Studio 2010 Express Beta 2 和 Release Candidate。

这个新的 C++ 功能在 vs2010 中是否存在错误?还是代码中有一些错误或误用?