问题标签 [boost-bind]

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 投票
2 回答
1013 浏览

c++ - “接口”类似于带有 boost::bind 的语义

我希望能够在 C++ 中使用类似 Java 的接口语义。起初,我曾经boost::signal为给定的事件回调显式注册的成员函数。这非常有效。

但后来我决定一些函数回调池是相关的,将它们抽象并立即注册所有实例的相关回调是有意义的。但我了解到的是,boost::bind和/或取值的特定性质this似乎打破了这一点。或者也许只是add_listener(X &x)方法声明改变了boost::bind生成的代码的事实。

我对问题发生的原因有一个非常粗略的理解,我认为它可能按照其设计正常运行。我很好奇:我应该怎么做呢?当然有一个正确的方法来做到这一点。

这是一些示例代码:


好吧,我没有完全描述这个问题。标题具有误导性。

天啊。否决这个。我显然没有很好地描述这个问题,我认为这最终归结为主要是一个语法错误。:(

0 投票
1 回答
1121 浏览

c++ - 从结构数组中提取结构成员

我有一个包含多个变量的结构数组:

我想提取outputs 的向量,以便可以通过 将它们与另一个数组进行比较BOOST_CHECK_EQUAL_COLLECTIONS

我想出了这个:

但似乎我应该能够在没有每种类型的仿函数/结构的情况下做到这一点。

有没有更快的方法从结构中提取一个变量的向量/数组?我尝试使用 boost::lambda,但这不起作用:

显然operator.()不能用于 lambda 变量......我应该使用什么?提升::绑定?

0 投票
2 回答
2901 浏览

c++ - boost::bind 不适用于指针参数

我有这个简单的程序。在这里,我尝试将成员函数与对象绑定,然后使用成员函数调用中所需的参数进行调用。当成员函数采用指向 integer的指针时,gcc 无法编译。使用整数参数,程序被编译。这是 boost::bind 的错误还是我错过了什么?



0 投票
2 回答
1603 浏览

c++ - 在没有组合的嵌套 boost::bind 上执行参数替换

假设我有一个以空函子作为参数的函数:

我有另一个函数,它接受一个 int 并在内部做一些事情:

我想将这些嵌套但不组合在一起,以便我得到一个带有签名的函子:

当使用一个值调用时 - 比如 4 - 执行以下操作:

我的第一次尝试如下:

这失败了,因为 bind 在给定嵌套绑定时执行组合。首先调用 foo ,然后将值 void “返回”到 enqueue,但失败了。

我的第二次尝试如下:

这失败了,因为 enqueue 接受一个空函数,而不是一元函子。

我所寻求的可以完成吗?

其他信息:

  • 这与 6 年前未回答的 boost 论坛问题基本相同:http: //lists.boost.org/boost-users/2004/07/7125.php
  • 一些阅读表明,将 boost::lambda::bind 与 boost::lambda::unlambda 和 boost::lambda::protect 一起使用可能会满足我的要求。不幸的是 boost::lambda 的允许占位符 (3) 数量少得令人无法接受,而且编译时开销也很高。
0 投票
2 回答
2217 浏览

c++ - 帮助我理解 boost::bind 的用法

请看一下 Johannes Schaub 发布的这个示例,以对成对的向量进行排序:

如何根据对的第二个元素对对的向量进行排序?

我以为我确实理解 boost::bind,但我在这个方面遇到了麻烦。

问题一:

排序算法需要一个谓词函数作为第三个参数。我在这里看到的是一个布尔表达式。我错过了什么?:

boost::bind 库是否为这两个绑定重载 operator<,并返回某种函数指针(如 lambda)?

问题2:
这让我很困惑:

通常有某种函数指针作为绑定调用的第一个参数,但这里它是类成员的地址?该特定绑定的结果是什么?

感谢您的时间和帮助

0 投票
1 回答
4025 浏览

c++ - std::stringstream 作为函数的参数

我有一个std::vector<std::string> temp_results并且我希望使用 std::for_each 来遍历这个向量并连接一个字符串,所以我编写了以下构造:

我收到以下错误,这超出了我的理解:

有人可以解释什么是错的吗?

0 投票
1 回答
248 浏览

c++ - 在while循环中连接值出错

我有一个boost::variant,其中包含各种类型,我有一个字符串,它需要看起来像这样:type=D,S。变体中的值分别是 D 和 S,键是 'type'。这是map<std::string, std::vector<variant> >我现在正在迭代该vector<variant>部分的地方

现在我首先将 static_visitor 应用于我的变体以进行适当的转换,在这种情况下可能不需要,但对于其他类型,它需要转换为字符串。

然后我将这个函数称为ConcatValues,它是辅助类的一部分。这个类有一个vector<string> v_accumulator定义的,用来保存临时结果,因为这个函数可能会在 while 循环中被调用多次,我想最终得到一个逗号分隔值的列表。

然而,问题是我的向量v_accumulator在每个函数调用中总是空的?这有什么意义,因为它是一个类变量。

也许有一种更简单的方法可以在我的原始键/值对的值部分连接 D,S 的值?

0 投票
2 回答
1074 浏览

c++ - 我应该如何从父插槽中删除子对象?可能是 boost::asio 特定的

我编写了一个网络服务器类,它维护一个 std::set 网络客户端。网络客户端在断开连接时(通过 boost::bind)向网络服务器发出信号。当网络客户端断开连接时,需要将客户端实例从 Set 中移除并最终删除。我认为这是一种常见的模式,但我遇到的问题可能会或可能不会特定于 ASIO。

我试图精简到相关代码:

我相信从槽处理程序中删除客户端是不安全的,因为函数返回将是......未定义?(有趣的是,它似乎并没有对我造成影响。)所以我使用了 boost:shared_ptr 和 shared_from_this 来确保在所有插槽都发出信号之前不会删除客户端。不过,这似乎并不重要。

我相信这个问题不是 ASIO 特有的,但是在使用 ASIO 时,这个问题会以一种特殊的方式表现出来。我有一个线程执行 io_service.run()。所有 ASIO 读/写操作都是异步执行的。除非我按照上面的代码从 Set 中删除我的客户端对象,否则在多个客户端连接/断开连接时一切正常。如果我删除我的客户端对象,io_service 似乎会在内部死锁,除非我启动另一个线程,否则不会执行进一步的异步操作。我对 io_service.run() 调用进行了尝试/捕获,但无法检测到任何错误。

问题:

  1. 是否有从父插槽中删除子对象(也是信号发射器)的最佳实践?

  2. 关于我删除网络客户端对象时为什么 io_service 挂起的任何想法?

0 投票
2 回答
975 浏览

c++ - boost::bind 何时将参数转换为所需的类型?

当我使用 boost::bind 将参数绑定到函数时-它们何时转换为函数所需的类型(如果可以进行隐式转换)?

它们是如何存储在 bind_t 对象中的?作为最初传递给 bind 的类型还是作为函数签名所需的类型?

具体来说:

如果我有签名的功能

我使用绑定作为

somePtr类型在哪里SomeType*,该bind_t对象将包含somePtr存储为简单指针的副本还是将其强制转换为SmartPointer<SomeType>并存储为SmartPointer<SomeType>

SomeType*从to有一个隐式转换SmartPointer<SomeType>。与在托管对象boost::shared_ptrSmartPointer使用引用计数器相反,含义SomeType必须从SmartPointed.

0 投票
1 回答
1004 浏览

c++ - 如何调用 shared_ptr从循环中的向量?

我有一个使用 boost::signal 的有效回调系统。我将它扩展为一个更灵活、更高效的回调管理器,它使用 shared_ptr 的向量来处理我的信号。我已经能够成功地创建回调并将其添加到列表中,但我不清楚如何实际执行信号。

所有这些代码都有效。我只是不确定如何使用向量从 shared_ptr 中运行调用。任何帮助都会很整洁。提前致谢。