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

c++ - std::bind 的返回类型可隐式转换为两个不同的显式构造函数

给定两个explicit构造函数重载(基于不同std::function<...>的类型),返回值std::bind可以选择其中一个(从而使调用不明确)

如果我注释掉任何一个,那么代码就会编译!

我会认为让构造函数explicit要么选择正确的重载,要么阻止两者都被选中?

当然,在我绑定的时候明确地创建一个:std::function

但是,我很困惑为什么类型推导不起作用?

  • 如果 from 的返回值std::bind都不匹配两个构造函数签名,则它们的事实explicit应该防止两者都被选中。
  • 如果 from 的返回值std::bind与两个构造函数签名之一匹配,则它们的事实explicit应该会导致选择正确的一个。

这里实际发生了什么?

完整的工作代码如下:

0 投票
1 回答
244 浏览

function - 使用 std::bind 绑定到父版本的虚函数

我想为父类的虚拟和重写函数版本创建一个 std::function 对象,请参见以下示例:

虽然调用child.func1()行为符合预期,但调用child.func2()变成了无限递归,parent_func2()似乎是调用Child::func2()而不是Parent::func2()我打算将其绑定到的位置。

知道我怎么能parent_func2()真正打电话Parent::func2吗?

0 投票
2 回答
515 浏览

c++11 - 使用 std::bind 与 lambda 进行绑定。它们有多贵?

我在玩 bind,我在想,lambdas 和函数指针一样贵吗?

我的意思是,据我了解 lambda,它们是函子的语法糖,并且 bind 是相似的。但是,如果您这样做:

现在,如果我使用 1st auto bound = std::bind(fn2, a, b);,我会得到一个输出

3、4

1, 2

,第二个我得到
3、4

3、4

. 第三个和第四个我得到像第一个一样的输出。

现在我明白了为什么第一个和第二个以这种方式工作,它们在函数调用开始时被初始化(静态的,只有第一次被调用)。然而,3 和 4 似乎有编译器的魔力,其中生成的函子并没有真正创建对封闭范围变量的引用,而是实际上锁定了符号,无论它是否仅在第一次或每次初始化。

有人可以澄清这里实际发生的事情吗?

编辑:我缺少的是使用static auto bound = std::bind(fn2, std::ref(a), std::ref(b));它作为第四个选项。

0 投票
2 回答
1015 浏览

c++ - 从 std::vector c++ 调用 std::function 时崩溃

当我这样做时,我得到了这个错误

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

打电话时dutyStack[0]();。但是,如果我添加dutyStack.reserve(10);或者向量中只有一个元素,则不会出现错误。我怀疑在调整矢量大小时复制元素时发生了一些事情,但我真的不知道。

我在visual studio 2008,Windows 7下。

0 投票
1 回答
595 浏览

c++ - 为什么 std::bind 不能作为参数包的参数?

我想使用参数包,但发现问题。一些代码:

所有这些都运作良好:

但是如果我想将 std::function 提供给参数包:

应用程序不再编译。

那么,在包中使用函数作为参数有什么问题呢?

谢谢。

更新: 如果将 f 的代码更改为:

它工作得很好,但我不想在这里执行这个函数,我想创建函数并像参数一样传递它。

UPDATE2: 代码执行示例:http: //ideone.com/gDjnPq

UPDATE3: 清除代码编译错误:http: //ideone.com/50z7IN

0 投票
1 回答
112 浏览

c++ - 可以使用 std::bind1st 将 void (*)(void*,int) 转换为 void (*)(int) 吗?

我有一个函数void f (void*, int);,用作回调函数。调用者期望void (*)(int). 我可以std::bind1st用来将一个转换为另一个吗?有没有办法在不使用 C++ 11 的情况下做到这一点std::bind,只是std::bind1st

0 投票
1 回答
289 浏览

c++ - 使用 std::bind 结果构造 std::function 时发生堆栈溢出

我正在编写一个简单的库并std::function用作库用户的回调。

我想要一些类似f4简化回调函数的东西。

我对std::bind内部不熟悉。

为什么f3不能构造f4

我在用

clang++ : Apple LLVM 5.0 (clang-500.2.79) (基于 LLVM 3.3svn)

在 OSX10.9 macbook 上

编译:

clang++ -g -std=c++0x test.cpp

f4 处的堆栈溢出,因为流动的东西的无限调用:

0 投票
2 回答
2132 浏览

c++ - 如何传递参数来提升 asio async_accept

我有一个问题。

我正在使用 boost::asio 开发聊天服务器。

和这里,

在 std::bind 处发生错误。

“错误 c2064 术语不计算为采用 3 个参数的函数”

我应该怎么办?

谢谢。

0 投票
1 回答
1904 浏览

templates - std::bind 与模板成员函数

我有一个奇怪的问题,我无法绑定这个模板成员函数,所有这些代码都编译:http: //ideone.com/wl5hS8

这是一个简单的代码:我有一个ExecutionList应该在std::vector. 我现在可以通过调用来添加函数ExecutionList::addFunctor。但是在那里,我无法绑定到template<typename T> void Functor::calculate(T * t). 我在问我为什么,这里缺少什么,编译器无法以某种方式推断出我写的内容

*错误:*

编码:

0 投票
1 回答
1075 浏览

c++11 - 确定 std::bind() 结果的数量和其他特征的标准方法?

几天来,我一直在绞尽脑汁,试图弄清楚如何让一个类有一个漂亮干净的公共接口来执行回调机制的注册。回调可以是 C++11 lambda、std::function<void(Type1,Type2)>std::function<void(Type2)>std::function<void()>std::bind().

这个接口的关键是该类的用户只需要知道一个公共接口,该接口几乎可以接受用户可能抛出的任何函子/回调机制。

显示仿函数和接口注册的简化类

使用 enable_if<> 复杂的唯一原因是打开/关闭某些方法。我们必须这样做,因为当我们想要将 std::bind() 的结果传递给 Register() 方法时,如果我们有这样的简单签名,它可能会模糊地匹配多个注册方法:

我没有重新发明轮子,而是引用了 traits.hpp,然后用我自己的名为“functor_traits”的 trait helper 包装了它,它增加了对 std::bind() 的支持

到目前为止,这就是我想出的识别有界函数“arity”的方法......或者绑定结果期望的参数数量:

我试图找到绑定结果arity

虽然这个实现在 gcc 中与 libstdc++ 一起工作,但我不太确定这是否是一个可移植的解决方案,因为它试图分解 std::bind() 的结果......我们真正应该的几乎私有的“_Bind”类不需要像 libstdc++ 的用户那样做。

所以我的问题是: 我们如何在不分解 std::bind() 的结果的情况下确定绑定结果的数量? 以及 我们如何实现尽可能支持有界参数的 function_traits 的完整实现?