问题标签 [stdbind]

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 投票
1 回答
2184 浏览

c++ - 为 boost::signals2 绑定类成员函数

我使用 std::bind 创建了一个涉及类成员函数的 lambda,但 boost::signals2 不会接受它。

我有一门课Cut,我想在有新课时Event通过调用来通知void Cut::newEvent(Event& e)

我创建了一个到 Cut 实例的 lambda 绑定,当我将事件传递给它时,它按预期工作。(代码编译,输出为“Registered new event”。)

但是,当我尝试将此 lambda 连接到boost::signals2::signal<void(Event&)>它的实例时,会出现以下消息:

error: 'f' cannot be used as a function

这很奇怪,因为我可以将它用作 main() 中的函数。(如果我使用std::function<void(Event&)>而不是 auto,我会得到相同的结果。

有可能完成这项工作吗?为什么它目前不起作用?

这是相关代码:

0 投票
1 回答
115 浏览

c++ - 在基类中,如何定义一个容器来包含函数 obj,它可以是派生类的任何函数?

我想在基类中定义一个容器,其中包含函数 obj 或任何可以实现我的目的的东西。这些函数 obj 可以调用派生类的函数。它们都采用相同的参数。

0 投票
2 回答
3355 浏览

c++ - 如何将非静态类成员`std::bind` 绑定到 Win32 回调函数`WNDPROC`?

我正在尝试将非静态类成员绑定到标准WNDPROC函数。我知道我可以通过使类成员静态来简单地做到这一点。但是,作为 C++11 STL 学习者,我对使用<functional>标题下的工具非常感兴趣。

我的代码如下。

当我按原样运行它时,它会给出错误消息:

0 投票
3 回答
4188 浏览

c++ - 用 C++11 接口包装 C 回调的最佳方法是什么?

假设这是一个要包装的 C 函数:

C 函数指针回调的两个主要缺陷是:

  • 无法存储绑定表达式
  • 无法存储捕获的 lambda

我想知道包装这些函数的最佳方法。第一个对于成员函数回调特别有用,第二个对于使用周围变量的内联定义特别有用,但这些并不是唯一的用途。

这些特定函数指针的另一个属性是它们需要使用__stdcall调用约定。据我所知,这完全消除了 lambdas 作为一个选项,否则有点麻烦。我想至少__cdecl也允许。

这是我能想到的最好的方法,而不会开始转向依赖函数指针所没有的支持。它通常在标题中。这是Coliru上的以下示例。

然而,有一个重大缺陷。这不是重入。如果变量在使用之前被重新分配,则永远不会调用旧函数(不考虑多线程问题)。

我尝试过的一件事最终会加倍自身,是将 存储std::function为数据成员并使用对象,因此每个对象都会对不同的变量进行操作,但是无法将对象传递给代理。将对象作为参数会导致签名不匹配并且绑定它不会让结果存储为函数指针。

我有一个想法,但还没有玩过,是std::function. 但是,我认为唯一真正安全的擦除它的时间是在没有任何东西使用它时清除它。但是,每个条目首先添加在 中wrappedFoo,然后在 中使用proxyCallback。我想知道在前者中递增并在后者中递减,然后在清除向量之前检查为零的计数器是否会起作用,但这听起来像是一个比必要的更复杂的解决方案。

有没有办法用函数指针回调包装 C 函数,使得 C++ 包装版本:

  • 允许任何函数对象
  • 允许的不仅仅是 C 回调的调用约定(如果它是相同的至关重要,用户可以通过正确的调用约定传入一些东西)
  • 是线程安全的/可重入的

注意:作为 Mikael Persson 回答的一部分,显而易见的解决方案是利用void *应该存在的参数。然而,遗憾的是,这不是一个万能的、最终的选择,主要是由于无能。对于那些没有此选项的功能,存在哪些可能性是有趣的地方,并且是获得非常有用的答案的主要途径。

0 投票
1 回答
3535 浏览

qt - Qt 和 std::bind

我试图在 Qt 5.1 和 MSVC 2010 中使用 std::bind 将 QNetworkReply 事件挂钩到成员函数,同时将回复作为参数传递。直接将 std::bind 放在连接行中失败,在 MSVC 2010 上出现大量模板错误,但使用 std::function 将其分为两行。我很想坚持一条线。使这一切发生的魔法咒语是什么?

0 投票
1 回答
267 浏览

c++ - Parallel of std::reference_wrapper for std::shared_ptrs

If you want to bind a reference to a function f, you can use std::bind(f, std::ref(x)). In this case f takes a reference or makes a copy.

Now I have a function void g(T & t). I would like to bind the input argument to std::shared_ptr<T> mySharedPtr like this: std::bind(g, mySharedPtr). This would guarantee that mySharedPtr's data would have a lifetime at least as long as the bind. But since g takes a reference, this does not type-check.

Is there something similar to std::ref that takes a std::shared_ptr and dereferences it before passing it into g? If not, could I make one myself?

(If you give an answer using lambdas, please also include one without lambdas since my compiler does not support them.)

Edit: std::bind(g, std::ref(*mySharedPtr)) does not work since it loses the lifetime guarantee of the std::shared_ptr.

0 投票
1 回答
138 浏览

c++ - 我可以 std::bind 基类的构造函数,以便派生不需要显式调用它吗?

我有一个抽象基类,它需要一些对象传递给它的构造函数来初始化它的成员。但我想摆脱通过派生类构造函数传递这些对象。

传递给基类的对象对于所有创建的派生类都是相同的实例。有没有办法将它们绑定到基类的构造函数,这样我就不必通过派生类的构造函数转发它们?

0 投票
3 回答
275 浏览

c++ - C++ std::bind 接受 typename 作为第一个参数

我遇到了一些奇怪的行为。

这段代码给了我错误:

似乎std::bind不喜欢类型名作为输入。有解决方法吗?手动使用std::bind相同的参数可以正常工作,但它是更多样板代码:

即使没有任何输入,它仍然在编译时出错。为什么我的功能不起作用?

编辑:感谢您的帮助。事实证明,bind 不接受类型名,它接受地址。

0 投票
1 回答
1073 浏览

c++ - 使用 std::bind 从 BinaryPredicate 创建 UnaryPredicate 以在 std::transform 中使用

我最近遇到了这种用法for_each

嗯,它有效。对于 Ts 和 T f 的容器,这会将每个值乘以 f。但是我不喜欢在这里使用 lambda。它很短,但在我看来,它只重复了std::multiplies. 此外,它不应该是for_each, buttransform来表达修改的意图。

但是,std::multiplies是二元谓词,std::transform需要一元谓词。

我试图将 f 绑定为一个参数,但显然我用错了:

GCC 尝试通过错误消息给我一个提示,但我没有看到实际原因:

我怀疑我用std::bind错了。我的错误是什么?

0 投票
0 回答
164 浏览

c++ - std::bind 的结果是否具有类似 boost 的重载运算符?

Boost为 boost::bind 结果类型重载了运算符。所以!bind(f, ...)等价于bind( logical_not(), bind(f, ...) )。也可以使用其他一些运算符,如 ||、&&。std::bind 是否具有相同的功能?一个可以用!std::bind(...)吗?std::not1在 c++11 中被弃用了吗?