问题标签 [boost-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.
c++ - 传递并调用成员函数(boost::bind / boost::function?)
我有一个可能令人尴尬的简单问题:传递和调用类中的成员函数。我知道我想使用 BOOST 绑定(和或函数),但我还没有真正掌握它的概念。
以下代码编译并执行有问题。但是当我想将“f3”函数更改为非静态类函数时,乐趣就开始了:
现在,改变后
到
编译器不高兴并告诉我“错误:没有匹配函数调用'Test::f2()'”
阅读了许多关于 boost::bind 和 boost::function 的 SO 帖子后,我认为我需要更改 f2() 的定义以及 f1() 如何调用 f2() 将 f3() 作为调用目标,但是除此之外......关于 boost::bind 和 boost 函数的每一个组合我都尝试过编译失败。
我需要怎么写这个?作为一个额外的问题:是否有任何关于 boost::bind 和 boost::function 的简单介绍性读物?BOOST 文档在那里并没有真正帮助我。
B.
boost - 提升绑定到数据成员回调行为
有人可以解释这段代码吗?
为什么要定义bar
编译,它的结果是什么?
编辑:foo()
按预期工作,调用c.member()
,但bar()
没有。
c++ - 为什么我不能在 Objective-C++ 块中使用 boost::function?
以下代码抛出异常
在行f()
(在执行块时):
但是,根据有关 blocks 的文档,
通常,您可以在块中使用 C++ 对象。在成员函数中,对成员变量和函数的引用是通过隐式导入的 this 指针进行的,因此看起来是可变的。如果复制块,有两个注意事项:
如果您有一个 __block 存储类来存储基于堆栈的 C++ 对象,则使用通常的复制构造函数。
如果您在块中使用任何其他基于 C++ 堆栈的对象,则它必须具有 const 复制构造函数。然后使用该构造函数复制 C++ 对象。
通常这似乎是正确的;如果我将f
上面替换为带有 的简单类的实例operator()()
,则上面的代码将按预期运行。
为什么版本不boost::function
工作?
c++ - 删除 boost::bind 的原始指针参数
假设我分配了堆A*
,我想将其作为参数传递给boost::bind
.
boost::bind
保存在一些 STL 中以供以后处理,例如boost::functions
's 的容器。
我想确保A*
将在销毁 STL 容器时被销毁。
演示:
如何做呢?
编辑
也许我想要的不是那么现实。
我有原始指针和接收原始指针的函数。调用通过boost::bind延迟。在这一点上,我想要自动内存管理,以防 boost::bind 想要执行。我很懒,所以我想使用“准备好的”智能指针解决方案。
std::auto_ptr看起来是一个不错的候选者,但是......
不编译(见这里)
pAutoA 被破坏,删除底层 pA。
编辑 02
在提到的容器中,我需要存储带有不同参数的杂项“回调”。其中一些是指向对象的原始指针。由于代码很旧,我并不总是可以更改它。
为在容器中存储回调编写自己的包装器是最后的手段(虽然可能是唯一的),因此是赏金。
c++ - boost::factory 创建 boost::enable_shared_from_this 类
我有多个源自 A 的类
[...]
我想使用 boost::factory 创建一个工厂模式,我写过类似的东西:
当然,它不会编译...给我错误:
任何想法,我应该如何实现它?
c++ - 类内部 lambdas 和 boost 函数
我正在使用 C++0x 的 lambdas 来定义 boost 函数。我有一些类,我使用 lambdas/boost 函数定义它们的一些行为。我想知道的是,是否可以在不更改函数定义的情况下将有关类的数据公开到 lambda 的上下文中?例如,我有一组这样的类:
在 stat boosting item 的构造函数中,我希望能够做到这一点:
这更像是一件好奇的事情,因为我知道我可以简单地扩展 boost::function 定义以包含指向相关项目的指针并以这种方式获取数据,或者覆盖我的 Use 函数。但是,如果我能以某种方式将有关包含它的类的信息公开到 lambda 中,那将是理想的,因为我也可以在其他地方使用它
c++ - 使用 typedef 函数指针的不完整类型
我有一个抽象基类,它定义了数据接收器的接口。数据接收器的具体实现是通过工厂获得的。为了整理代码,我为工厂方法创建了一个 typedef,它从 DataSink 抽象基类中返回新的 DataSink 对象。
如果我随后尝试在某处声明:
boost::function<get_new_data_sink_function_type> getNewDataSinkFunction_;
某处,我得到:
error: field 'getNewDataSinkFunction_' has incomplete type
如果我改为声明:
boost::function<std::auto_ptr<DataSink>(std::string)> getNewDataSinkFunction_;
...一切都很好。
我意识到 DataSink 是一个不完整的类型,因为它是抽象的,但是因为由于 std::auto_ptr 我正在使用引用语义,所以应该没问题,对吧?无论如何,这并不能解释为什么 typedef 失败并且 typedef 定义的剪切和粘贴成功。这是 boost::function 的怪癖吗?
编译器是 gcc 4.3.3。任何见解都非常感谢。
c++ - tr1::function 可以吞下返回值吗?
boost::function FAQ item 3专门解决了我感兴趣的场景:
为什么有无效退货的解决方法?C++ 允许它们!C++ 标准允许无效返回,如以下代码片段所示:
这是 boost::function 的有效用法,因为不使用 void 返回。使用 void 返回,我们将尝试编译格式错误的代码,类似于:
本质上,不使用 void 返回允许 boost::function 吞下返回值。这与允许用户使用不完全匹配的参数分配和调用函数和函数对象是一致的。
不幸的是,这在 VS2008 中不起作用:
这会产生以下错误:
这是 VS2008 TR1 实施的失败吗?这在VS2010中有效吗?TR1 是否解决了此功能?C++0x 怎么样?