问题标签 [function-object]

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 投票
2 回答
168 浏览

c++ - 如何在 C++ 中正确定义函数对象?

我在无法修复的非常简单的代码上遇到了一个非常奇怪的错误。

我定义了以下函数对象:

在这里,该类Point<n>在之前已经很好地定义了将n点的坐标存储在n维空间中(使用所需的运算符,...)。

我希望p使用Point<5> p. L2Norm<5>(p)但这给了我以下错误:

我很确定我犯了一个非常愚蠢的错误,但我不知道在哪里!


PS作为一个附带问题,如果我只能说L2Norm(p)并且编译器检测到模板参数会更好,p但据我所知,这是不可能的。我对吗?

0 投票
3 回答
1469 浏览

c++ - 通过(函数对象)类(可变参数)模板的函数包装器

C++

我正在尝试通过(函数对象)类(可变参数)模板实现函数包装器。该类具有作为其唯一数据成员的函数指针,该函数指针由它所包装的函数指针初始化或分配。参数化构造函数接受一个函数指针并通过它初始化成员。该operator()方法接受参数(或无参数)并使用它们调用包装函数。至少是这样的想法。我收到很多错误,我用评论标记。VC11(带有 2012 年 11 月的 CTP,以启用可变参数模板)error C2091: function returns function除了标记的区域之一之外,都提供给我。最后一个错误不同,我在代码中注释了它的完整描述。g++ 给出了几乎相同的错误,尽管代码不同。

为什么我会收到这些错误?例如,我看不到参数化构造函数如何返回任何内容,或者数据成员的声明如何返回任何内容。数据成员声明不就是函数指针声明的形式吗?例如,不int (*g)(int);声明一个指向一个函数的指针,该函数接受一个int并返回一个int

编辑/附录:

我从答案中看到int(int, int)只有一种类型,我需要部分专业化才能获得我想要的效果。但是,是什么在我的代码中产生了错误?如果我注释掉myfunc = foo,我仍然会收到其他错误。func<int(int, int)> myfunc;调用默认构造函数。typename R被实例化为int(int, int),并typename... Tn变为空。数据成员R (*fptr)(Tn...);变为R (*fptr)();fptr因此是一个函数指针,它指向一个函数,该函数接受零参数并返回一个R。如果Rint(int, int),那么是R函数指针类型还是函数类型?如果是后者,那么我可以理解错误消息的上下文。

0 投票
1 回答
85 浏览

c++ - std::set - 我的容器中的函数对象支持

我已经实现了自己的容器:

我想要做的是添加对函数对象的支持,就像在 std::set 中一样,可以像这样执行函数对象:

然后将其作为设置参数传递:

我不是日常的 C++ 程序员,所以我需要帮助来实现这一点。为了增加对此的支持,我必须做什么?我必须创建字段MyContainer才能在其中存储函数对象以在容器内的排序方法中使用它吗?

0 投票
2 回答
1951 浏览

c++ - const 和非 const 函子

这似乎是应该经常问和回答的问题,但我的搜索失败了。

我正在编写一个函数,我想接受某种通用的可调用对象(包括裸函数、手动仿函数对象bind、或std::function),然后在算法的深处调用它(即 lambda)。

该函数当前声明如下:

我通过引用接受函子,因为我想保证它不会在进入函数时被复制,因此实际上调用了对象的相同实例。它是一个 const 引用,因为这是接受临时对象的唯一方法(这在使用手动仿函数或bind)。

但这需要函子实现operator()为 const。我不想这样要求;我希望它能够接受两者。

我知道我可以声明此方法的两个副本,一个接受它作为 const,另一个接受它作为非常量,以涵盖这两种情况。但我不想这样做,因为注释隐藏了很多我不想复制的代码(包括一些循环结构,所以我不能在不移动问题的情况下将它们提取到辅助方法) .

我也知道我可能会作弊const_cast在调用它之前将仿函数和非 const 作弊,但这感觉有潜在的危险(特别是如果仿函数有意实现 const 和非 const 调用运算符,则会调用错误的方法)。

我考虑过接受函子作为std::function/boost::function,但这感觉像是对应该是一个简单问题的沉重解决方案。(特别是在函子应该什么都不做的情况下。)

除了复制算法之外,是否有一种“正确”的方法来满足这些要求?

[注意:我更喜欢不需要 C++11 的解决方案,尽管我也对 C++11 的答案感兴趣,因为我在两种语言的项目中都使用了类似的结构。]

0 投票
2 回答
170 浏览

c++ - 函数对象的正确参数类型是什么?

我有一个接收函数对象的模板函数。有时函数对象是无状态结构,但有时它们是大型有状态对象。函数对象的状态在这个函数中没有改变,只是检查。我也非常热衷于编写编译器可以尽可能优化的代码。选择参数类型时应该考虑什么?

该函数属于这种类型:

参数类型可能应该是funcT const & fun这样大对象不被复制,但是为什么大多数人使用按值调用函数对象呢?我是否通过使用 const 引用丢失了一些东西?或者我应该使用左值引用?请注意,c++1y 是可以的,上面的代码示例只是一个示例。

0 投票
1 回答
584 浏览

c++ - 函子:模板化结构与模板化操作符()

标准库函数对象的通常模式是有一个带有非模板的模板结构operator()。例如,std::less看起来像这样:

我的问题是,为什么这比带有模板的非模板结构更好operator()?似乎上述仿函数在操作上等同于:

除了我们得到自动类型扣除的奖金。更好的是,如果我们愿意,我们可以比较不同的类型,前提是这样做有意义:

例如,从那里很明显我们可以如何使用decltype来获得真正的通用std::plus。但是标准库不会那样做。

当然,我确信我不是第一个发生这种情况的人,而且我确信标准委员会决定采用第一种模式而不是第二种模式是有充分理由的。我只是不确定它是什么。有哪位大师能开导我吗?

0 投票
2 回答
420 浏览

c++ - 为什么 N3421 不提供 noexcept 限定符?

N3421 - Making Operator Functors Greater<>中,std 函数对象的新特化是:

代替

  • 这有什么原因吗?
  • noexcept在这个用例中是否有遗漏?

编辑:链接到 github 中的工作草案行

编辑 2:链接到 libc++ plus specialization

0 投票
2 回答
2016 浏览

c++ - 带有用户定义比较和随机访问迭代器的 std::map 上的 make_heap

我有一张这样定义的地图

处理完这张地图后,我想把它当作一个堆(基于第二个值)。我决定使用 std::make_heap 函数......它的定义是这样的......

因为这个函数需要定义一个比较函数......我这样做了

现在有了这个设置,我像这样调用 make_heap

但这给了我编译错误......

编译错误给了我一个提示,他们可能是因为 make_heap 需要 random_access_iterator ......但我不确定。

我应该转到函数对象(从普通函数指针)吗?

有什么帮助吗?

0 投票
2 回答
315 浏览

c++ - C++ 中的 funcall:声明将函数作为参数的函数

网上有很多使用 STL 将函数或函数对象作为参数传递的示例,例如在 std::count 中。

我如何编写自己的函数来接受这些参数?

举个简单的例子,假设我的课程是:

我想定义一个函数funccall,如:

其中声明“功能”是我不确定的,除其他外。术语“funcall”来自 Lisp,(funcall f a b c)仅适用f于参数 ab c。

然后这样的事情应该工作:

有什么简单的方法可以做到这一点?

我正在编写这些作为调试助手,“funcall”将用作我自己的实现的一部分,就像我自己的数据结构的 count、remove-if、transform 和其他类似 STL 函数一样,它们接受函数参数。但我不想编写复杂的模板表达式来定义我的代码。


这个问题的初步答案表明,声明和使用函数参数的整个概念有点模糊,至少对我来说是这样。也许在处理 funcall 之前,更简单的任务可能是将函数参数传递给另一个函数,而不是使用它。例如,在 C++ 中,要计算一个向量 v 我必须写

如何编写一个始终计算整个向量的计数,以便:

和上面一样吗?这个“mycount”可以用于成员函数指针而不是 lambdas 吗?

这个问题与“funcall”问题基本相同,但不需要实际调用传递的函数对象。

0 投票
1 回答
191 浏览

javascript - 函数还是对象,哪个先出现?

在此处输入图像描述

有这个对象布局图很好地解释了javascript中的原型链。但是当谈到以下之间的关系时,我有点困惑:

  1. 函数对象(){}
  2. 对象.原型
  3. 函数函数(){}
  4. 函数原型

我的问题是:在上述四个要素中,哪个先出现?因为我看到了它们之间的循环。

  1. 函数对象.____proto____ -> Function.prototype
  2. Function.prototype.____proto____ -> Object.prototype
  3. Object.prototype.constructor -> 函数对象

还有另一个循环是:

  1. Function.prototype.constructor -> 函数函数
  2. 函数 Function.____proto____ -> Function.prototype

这怎么可能?