问题标签 [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.
c++ - std::bind 的返回类型可隐式转换为两个不同的显式构造函数
给定两个explicit
构造函数重载(基于不同std::function<...>
的类型),返回值std::bind
可以选择其中一个(从而使调用不明确)
如果我注释掉任何一个,那么代码就会编译!
我会认为让构造函数explicit
要么选择正确的重载,要么阻止两者都被选中?
当然,在我绑定的时候明确地创建一个:std::function
但是,我很困惑为什么类型推导不起作用?
- 如果 from 的返回值
std::bind
都不匹配两个构造函数签名,则它们的事实explicit
应该防止两者都被选中。 - 如果 from 的返回值
std::bind
与两个构造函数签名之一匹配,则它们的事实explicit
应该会导致选择正确的一个。
这里实际发生了什么?
完整的工作代码如下:
function - 使用 std::bind 绑定到父版本的虚函数
我想为父类的虚拟和重写函数版本创建一个 std::function 对象,请参见以下示例:
虽然调用child.func1()
行为符合预期,但调用child.func2()
变成了无限递归,parent_func2()
似乎是调用Child::func2()
而不是Parent::func2()
我打算将其绑定到的位置。
知道我怎么能parent_func2()
真正打电话Parent::func2
吗?
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));
它作为第四个选项。
c++ - 从 std::vector c++ 调用 std::function 时崩溃
当我这样做时,我得到了这个错误
运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。
打电话时dutyStack[0]();
。但是,如果我添加dutyStack.reserve(10);
或者向量中只有一个元素,则不会出现错误。我怀疑在调整矢量大小时复制元素时发生了一些事情,但我真的不知道。
我在visual studio 2008,Windows 7下。
c++ - 为什么 std::bind 不能作为参数包的参数?
我想使用参数包,但发现问题。一些代码:
所有这些都运作良好:
但是如果我想将 std::function 提供给参数包:
应用程序不再编译。
那么,在包中使用函数作为参数有什么问题呢?
谢谢。
更新: 如果将 f 的代码更改为:
它工作得很好,但我不想在这里执行这个函数,我想创建函数并像参数一样传递它。
UPDATE2: 代码执行示例:http: //ideone.com/gDjnPq
UPDATE3: 清除代码编译错误:http: //ideone.com/50z7IN
c++ - 可以使用 std::bind1st 将 void (*)(void*,int) 转换为 void (*)(int) 吗?
我有一个函数void f (void*, int);
,用作回调函数。调用者期望void (*)(int)
. 我可以std::bind1st
用来将一个转换为另一个吗?有没有办法在不使用 C++ 11 的情况下做到这一点std::bind
,只是std::bind1st
?
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 处的堆栈溢出,因为流动的东西的无限调用:
c++ - 如何传递参数来提升 asio async_accept
我有一个问题。
我正在使用 boost::asio 开发聊天服务器。
和这里,
在 std::bind 处发生错误。
“错误 c2064 术语不计算为采用 3 个参数的函数”
我应该怎么办?
谢谢。
templates - std::bind 与模板成员函数
我有一个奇怪的问题,我无法绑定这个模板成员函数,所有这些代码都编译:http: //ideone.com/wl5hS8
这是一个简单的代码:我有一个ExecutionList
应该在std::vector
. 我现在可以通过调用来添加函数ExecutionList::addFunctor
。但是在那里,我无法绑定到template<typename T> void Functor::calculate(T * t)
. 我在问我为什么,这里缺少什么,编译器无法以某种方式推断出我写的内容
*错误:*
编码:
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 的完整实现?