问题标签 [std-function]

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 投票
3 回答
1015 浏览

c# - 传递成员函数,如 C++ 中的 std::function(如 C# 中)

我有一个模板类 Delegate,带有一个重载的 += 运算符,这使得使用类似于 C# 的委托。

这就是我想要做的:

有没有办法让d += test;工作?

0 投票
1 回答
1397 浏览

c++ - 如何避免使用 std::bind() 临时对象进行显式强制转换?

std::bind 的返回类型(有意)未指定。它可以存储在 std::function 中。

下面的示例程序显示了我必须如何将 std::bind() 返回的临时对象显式转换为 std::function 才能调用 fn1()。

如果 std::bind 的返回类型是已知的,我可以重载 Callback 构造函数,并且不再需要显式转换 std::bind 临时对象。

有什么办法可以避免显式演员表?

可能不相关,但我在 Linux 上使用 gcc 4.7.2。

0 投票
1 回答
220 浏览

c++ - 自定义排序以通过构造函数映射

我不知道如何通过std::map以下方式将自定义排序行为传递给 a:

我怎样才能将比较器传递给地图?

0 投票
1 回答
271 浏览

c++ - std::function 指向接受右值争论的成员函数的指针 MSVC2010 SP1

我想创建一个 std::function 绑定到采用右值参数的成员函数。这是我无法编译的尝试(“xxfunction(154): error C2664: ... You cannot bind an lvalue to a rvalue reference”等等)。

我做了一些阅读,我认为这与 std::function 没有使用完美转发有关,但我不知道如何让它工作。

编辑:

这是一个半可行的解决方法,但它并不完美,因为调用 pF 现在将使用左值并移动它。

0 投票
1 回答
1164 浏览

c++ - 将函数分配给具有相同签名但不同调用约定的 std::function 失败

以下使用 mingw 4.7.2 和 -m64 标志编译并运行得很好。

但使用 -m32 或任何 mingw 32 位版本无法编译。是错误还是我缺少编译器标志?

错误信息:

在将调用“隐藏”在 lambda 函数中之后,我最终这样做了,它工作得很好:

0 投票
8 回答
62957 浏览

c++ - std::function 与模板

感谢 C++11,我们收到了std::function函子包装系列。不幸的是,我一直只听到关于这些新增功能的坏消息。最受欢迎的是它们非常慢。我对其进行了测试,与模板相比,它们确实很糟糕。

111 毫秒与 1241 毫秒。我认为这是因为模板可以很好地内联,而functions 通过虚拟调用覆盖内部。

正如我所见,模板显然存在问题:

  • 它们必须作为标题提供,这不是您在将库作为封闭代码发布时可能不希望做的事情,
  • extern template除非引入类似策略,否则它们可能会使编译时间更长,
  • 没有(至少我知道)表达模板需求(概念,任何人?)的干净方式,禁止评论描述预期的函子类型。

因此,我是否可以假设functions 可以用作传递函子的事实上的标准,并且在期望高性能的地方应该使用模板?


编辑:

我的编译器是没有CTP的 Visual Studio 2012 。

0 投票
4 回答
18590 浏览

c++ - C++ 如何使用 std::bind / std::function 引用模板函数

如果您有模板类或模板函数(或两者的组合),您如何绑定该函数(保留模板类型参数)?

在下面的一篇文章中,我得到了一些关于基本语法的帮助,以绑定到具有显式模板类型参数的函数,但在此过程中失去了提供模板类型参数的能力。

是否有可能让它工作,以便仍然可以为将来的调用提供模板类型参数?

清理了这段代码很多,但它显然不会编译,因为我找不到正确的语法,(有没有办法做到这一点)?

删除了“矢量”要求以简化这一点:

谢谢您的帮助!

0 投票
1 回答
950 浏览

c++ - 我正在尝试将 lambda 作为参数传递

尝试将 lambda 传递给构造函数:

当我编译时,我收到一条错误消息:

0 投票
2 回答
2258 浏览

c++ - 用于排序 std::set 的 C++11 std::function 和 std::reference 包装器

我有一个 C++ 类,它的一个字段是 std::set 对象。我想自己写一个比较函数,或者让用户指定一个。在 C++11 中有一种处理泛型函数类型的新方法:std::function。它适用于函数指针、成员函数指针、lambda 函数等。

我尝试编写一个简单的实验程序,但它一直在卡顿,即使我按照 C++11 维基百科文章的建议进行操作。也许我只是不明白应该如何使用 std::function 和 std::ref 。

无论如何,关键是当我从一个简单的 lambda 函数创建一个 std::function 并使其成为类成员时,该类的 sizeof 增长了 22。当我从一个指向全局函数的指针创建一个 std::function 时,这个 std::function 的 sizeof 是 32。所以大小很大。我将有许多对象使用相同的比较函数,所以我更喜欢让所有对象都使用一个函数。

我有两个想法,告诉我你的想法。一个想法,使用 std::ref 存储对函数的引用,这样我可以定义一个函数,许多对象将使用它来比较 std::set 元素。第二个想法:如果它不能那样工作,或者生成的函数对象太大,也许我可以使用 shared_ptr。

您可能想知道:为什么没有一个静态 std::function 成员?答案是:因为所有对象都将使用相同的比较函数。例如,我希望能够拥有 1000 个对象,其中 400 个使用一个比较函数,600 个使用不同的比较函数。

例子:

现在如何让 std::set 使用 std::function,并让许多 MyClass 对象使用相同的函数?

我希望能够在运行时更改比较功能,以便用户能够选择集合中对象的顺序(由 GUI 显示)。

0 投票
6 回答
60601 浏览

c++ - C++11 std::set lambda 比较函数

我想创建一个std::set具有自定义比较功能的。我可以将它定义为一个带有 的类operator(),但我想享受定义一个使用它的 lambda 的能力,所以我决定在具有 的类的构造函数的初始化列表中定义 lambda 函数std::set作为成员。但我无法获得 lambda 的类型。在我继续之前,这里有一个例子:

经过搜索,我找到了两种解决方案:一种,使用std::function. 只需设置比较函数类型std::function<bool (int, int)>并像我一样传递 lambda。第二种解决方案是编写一个 make_set 函数,例如std::make_pair.

解决方案 1:

解决方案 2:

问题是,我有充分的理由更喜欢一种解决方案吗?我更喜欢第一个,因为它使用了标准功能(make_set 不是标准功能),但我想知道:使用是否std::function会使代码(可能)变慢?我的意思是,它是否会降低编译器内联比较函数的机会,或者它应该足够聪明以表现得与它是 lambda 函数类型一样,而不是std::function(我知道,在这种情况下它不能是lambda 类型,但你知道,我问的是一般情况)?

(我使用 GCC,但我想知道流行的编译器一般会做什么)

总结,在我得到很多很好的答案之后:

如果速度很关键,最好的解决方案是使用带有operator()aka functor 的类。编译器最容易优化和避免任何间接。

为了便于维护和更好的通用解决方案,使用 C++11 特性,使用std::function. 它仍然很快(只是比仿函数慢一点,但可以忽略不计),您可以使用任何函数 - std::function、 lambda 、任何可调用对象。

还有一个使用函数指针的选项,但如果没有速度问题我认为std::function更好(如果你使用 C++11)。

有一个选项可以在其他地方定义 lambda 函数,但是您不会从比较函数作为 lambda 表达式中获得任何收益,因为您也可以将其设为一个类,operator()并且定义的位置无论如何都不会是集合构造。

还有更多的想法,比如使用委托。如果您想更全面地解释所有解决方案,请阅读答案:)