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

c++ - 在类成员函数中声明和定义函数对象

我想知道是否以及如何在类成员函数中定义一个函数对象以直接使用它,例如 std::transform 函数。
我知道这个例子有点愚蠢,它只是为了展示我面临的问题。

文件“example.h”

文件“example.cpp”

自从我尝试直接在“example.cpp”中的成员函数内部实现函数对象以来,代码就没有被编译。我得到的错误信息是:

所以我认为在std::transform中使用struct“functor”时会出现问题。有人可以告诉我问题是什么吗?

使用:
Ubuntu Linux下的gcc-4.2编译器。

在此先感谢,
勒内。

0 投票
3 回答
2252 浏览

c++ - 模板中函数模板参数的访问结果类型?

给定以下模板:

...及其实例化,可能如下:

,有没有办法访问函数描述的返回类型并有条件地编译它?例如,如果调用者指定他的函数返回 bool(如上例所示),我想包含一个返回值的函数。如果他指定该函数为 void,我不希望包含此函数。例如:

我猜这里有一个解决方案,但它可能涉及一些可怕的混淆模板元编程解决方案。我知道 Gregor Cantor 在考虑无穷大时发疯了……模板元编程对我有同样的影响:p。

感谢您的任何想法。

罗宾逊

编辑:显然这可以通过实现一个不同的类(可能从一个公共基础派生)来解决,一个称为 VoidContainer 另一个称为 ReturnsContainer (或类似的)。然而这对我来说似乎有点不满意......

0 投票
5 回答
26985 浏览

c++ - std::function 的模板参数是如何工作的?(执行)

Bjarne Stroustrup的主页(C++11 FAQ)中:

它是如何工作的?std::function如何调用foo 成员函数

模板参数是int(X*, int)&X::foo成员函数指针转换为非成员函数指针?!


澄清一下:我知道我们不需要转换任何指针来使用std::function,但我不知道std::function的内部如何处理成员函数指针非成员函数之间的这种不兼容性指针。我不知道标准如何允许我们实现std::function之类的东西!

0 投票
2 回答
1222 浏览

javascript - parsing JSON - eval() or function object?

To parse JSON, I believe the best method is to use native JSON support in browsers.

I was looking for a good way to parse JSON in cases where native JSON support is not available.

When i looked at the code in https://github.com/douglascrockford/JSON-js/blob/master/json2.js, what i understood was it first checks whether the data is valid JSON using the regex:

and then applies eval().

jQuery performs $.parseJSON() by 1st using the above regex to check if it's valid JSON and then applies:

if native JSON is available it uses that, otherwise it uses "new Function".

Nowhere else did i find about using function objects for parsing JSON. Which is a better method - using eval() or function object? Can you explain what exactly does (new Function("return " + data))(); perform?

0 投票
3 回答
2985 浏览

c++ - 函子调用和函数调用的详细区别?

这样做的关键原因是 for_each () 实际上并没有假设 它的第三个参数是一个函数。它只是假设它的第三个参数是可以用适当的参数调用的东西。一个适当定义的对象和一个函数一样——而且通常比一个函数更好。例如,内联类的应用程序运算符比内联作为函数指针传递的函数更容易。因此,函数对象通常比普通函数执行得更快。具有应用运算符(第 11.9 节)的类的对象称为类函数对象、仿函数或简称为函数对象。

[Stroustrup,C++ 第 3 版,18.4-最后一段]

  1. 我一直认为operator()调用就像在运行时调用函数一样。它与普通的函数调用有何不同?

  2. 为什么内联应用程序运算符比普通函数更容易?

  3. 它们比函数调用快多少?

0 投票
4 回答
191 浏览

c++ - 帮助理解函数对象的工作原理?

我在维基百科上找到了这段代码

起初我想知道 A 和 B 参数是如何传递给 operator()(int A, int B) 的,当在 sort_ints 中提到函子时甚至没有任何括号。

然后我发现 A 和 B 被传递给 sort_ints 函数内的函数对象。但是,sort_ints 的声明不应该有 'ComparisonFunctor* * * c' 而不是 'ComparisonFunctor c',因为它正在接收函数的地址?

在 sort_ints 函数内部,对函子的函数调用会像这样吗?

0 投票
5 回答
1865 浏览

c++ - 如何将 std::generate/generate_n 与多态函数对象一起使用?

我是 std::generate 的新手,并试图构建一个使用它来初始化向量的程序。然而,它的表现与我的预期不同。

我有一个抽象基类:

由(例如)扩展:

我通过指针将继承类的实例传递给工厂类,然后将其用作 std::generate 的第三个参数:

现在我收到一条错误消息,说 RandomAllele 无法实例化,因为它是一个抽象类。当指针已经存在时,为什么 generate 需要实例化它?为什么它试图使用基类而不是继承类 RandomInt?

如果我将 std::generate 替换为:

但是我仍然希望了解它为什么会表现得很奇怪,如果有办法做到这一点,我更喜欢使用 generate。

谢谢你的时间,

里斯

0 投票
3 回答
1537 浏览

c++ - 如何用 doxygen 记录函数对象?

我应该如何用 doxygen 记录一个函数对象(AKA 函子)?仅将其记录为常规课程会产生误导。我发现将函数对象视为具有闭包的函数比可调用类要好得多。

有没有办法记录一个符合我偏好的函数对象?

0 投票
2 回答
2291 浏览

c++ - 使用带有 shared_ptr、函数对象的 STL 算法

我有一组 shared_ptr,我想将 remove_copy_if 与谓词的自定义函数对象一起使用。我不知道做到这一点的“最佳”方式。现在,我有这个工作:

我决定对 shared_ptr 进行 const 引用,因为该对象不会保留指针,而且这似乎比 shared_ptr 的额外副本更有效。

似乎只对对象进行 const 引用会更好,但我无法编译它。我把它改成了这个,但没有运气:

这是 g++ 的输出:

有没有其他方法可以做到,或者有什么建议吗?

0 投票
3 回答
1240 浏览

c++ - 为什么 C++ 函子比具有命名方法的对象更可取?

我最近对仿函数感到兴奋,并一直在使用它们。然后出现了我需要我的仿函数执行两个不同的操作的情况,我考虑向我的仿函数添加另一种方法(而不是重载 () 运算符)。这是否是不好的做法我不确定(也许你可以告诉我),但这让我开始思考为什么我首先使用函子而不仅仅是对象。所以我的问题是:

重载 () 运算符有什么特别之处,还是只是在语法上比使用普通命名方法更具吸引力?

更新:

首先,我知道为什么函子可能比其他问题中解释的函数指针更可取。我想知道为什么它们比具有命名方法的对象更可取。

其次,作为一个例子,当我想使用我的函子的另一个可能命名的方法时:基本上我有两个函数,一个计算称为图形分区的模块化的东西 -compute_modularity()另一个计算一些变化后的模块化增益的分区compute_modularity_gain()。我想我可以将这些函数作为同一个函子的一部分传递给优化算法,并将增益作为命名函数。我不只是将两个函子传递给算法的原因是我想强制它compute_modularity_gain()仅与另一个函子结合使用compute_modularity(),而不是另一个函子,例如compute_stability()(只能与compute_stability_gain(). 换句话说,增益函数必须与其兄弟函数紧密耦合。如果有另一种方法可以强制执行此约束,请告诉我。