问题标签 [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.

0 投票
2 回答
2862 浏览

c++ - 使用模板友元函数时未解析的重载函数类型

我有一个问题,我试图将类模板的友元函数填充到boost::function

中的两行都main不会编译。对于第一个,GCC 抱怨:

第二行的错误对我来说似乎更令人困惑:

我有点受阻,因为我不明白为什么double dot(Vec<2>, Vec<2>)不匹配。

关于这里发生了什么的任何想法?

0 投票
1 回答
539 浏览

c++ - 如何从模板签名创建 boost::function

最近我试图创建灵活的观察者模式实现,它隐藏了boost::signal. 我几乎成功了。

我有一个Observer类必须具有update模板参数提供的方法匹配签名。

使用示例:

observer如果没有重载update方法,一切正常。在那种情况下boost::bind不能推断出正确的方法来使用。不幸的是,我不能使用显式转换,因为我不知道更新参数(此信息在 中FunctionSignature)。

以下方法会导致麻烦:

我认为这boost::function可能有助于解决这个问题。我不知道如何仅使用模板签名将其与正确的成员方法绑定。

甚至可能吗?

0 投票
4 回答
442 浏览

c++ - 我怎样才能让 boost::function 不那么宽松?

有什么方法可以使第二次调用 RegisterCallback 不编译?

对于上下文:
我最近更改了回调签名并添加了 bool 参数。我以为我已经更新了所有使用它的东西,但我错了。除了RegisterCallback每次更改签名时重命名之外,我还想有一种方法让编译器强制使用所有参数。

0 投票
1 回答
946 浏览

c++ - Boost.Bind 与函数和 Python

我得到一些编译时错误,我不明白为什么会这样。以下代码将拒绝编译,给我以下错误:

错误 C2664: 'void (PyObject *,const char *,boost::type *)' : 无法将参数 1 从 'const char *' 转换为 'PyObject *'
错误 C2664: 'void (PyObject *,const char *,boost ::type *)' : 无法将参数 3 从 'boost::shared_ptr' 转换为 'boost::type *'

0 投票
2 回答
5965 浏览

c++ - boost绑定类函数指针

我希望能够在没有 foo 实例的情况下绑定 Foo.f1 的 s1 以本质上创建

然后我将 func1 和 func2 作为参数传递给其他函数,其中 Foo 最终被绑定:

问题:这可能吗?如果是,1)如何实现呢?2) MyFooFunc 的声明是什么?

0 投票
1 回答
201 浏览

c++ - 如何在一系列 boost::function 对象上使用 std::for_each?

0 投票
1 回答
1855 浏览

c++ - C++ 将函数从 DLL 加载到 Boost 函数中

我想从 DLL 加载特定函数并将其存储在 Boost 函数中。这可能吗?

谢谢,戈库尔。

0 投票
3 回答
3506 浏览

c++ - 在虚函数、函数指针和函子之间进行选择

我正在编写一个类,其中一个函数的实现取决于用户。目前我把它作为一个虚函数,用户需要重写我的类来提供它的实现。我正在考虑将其设为 functor(boost::function)/function_pointer 以便用户可以注册到它。应用程序对性能至关重要,速度比看起来漂亮的类更重要。更改为仿函数是否会带来一些性能优势?

在大多数情况下,它将是一个自由函数,因此函数指针应该没问题。但我想在某些情况下可能需要状态,因此它需要是一个仿函数。

通过允许注册 function_ptr 或 functor 并根据某些 bool 调用适当的函数,我会获得任何性能优势吗?类似的东西。

更新:

我正在编写一个共享库,客户端将动态链接它。没有 C++0x。:(

0 投票
1 回答
5633 浏览

c++ - 使用 boost::bind 传递比预期更多的参数安全吗?

使用,生成的可能会收到比绑定对象预期更多的参数。从概念上讲:

在这种情况下,func()在堆栈上接收 1、2 和 3,即使其签名表明它不接受任何参数。

这与更典型的boost::bindfor partial application用法不同,后者的某些对象的值是固定的,产生的 aboost::function需要更少的参数,但在调用绑定对象时提供正确数量的参数。

以下代码适用于 MSVC++2010 SP1。这是张贴的简化形式;原始代码也适用于 Linux 上的 g++4.4。

以下是否根据 C++ 标准定义良好?

我理解为什么zeroArg(42)有效:调用例程将未使用的参数放在堆栈上,而被调用例程根本无法访问。当被调用例程返回时,调用例程清理堆栈。由于它将参数放在堆栈上,它知道如何删除它们。

迁移到另一个架构或编译器会破坏这一点吗?更积极的优化会打破这一点吗?


我正在寻找更强有力的声明,无论是来自 Boost 文档还是来自标准文档。我也找不到一个明确的立场。

使用调试器并查看程序集和堆栈,很明显func从第一个示例中没有收到值 1,2 和 3:您在这方面是正确的。func0在第二个示例中也是如此。至少对于我正在查看的实现,MSVC++2010SP1 和 g++4.4/Linux,这是正确的。

查看引用的 Boost 文档,并不清楚传递额外参数是否安全:

请注意,在最后一个示例中,由 生成的函数对象bind(g, _1, _1, _1)不包含对第一个以外的任何参数的引用,但它仍然可以与多个参数一起使用。任何额外的参数都会被忽略,就像第三个例子中的第一个和第二个参数被忽略一样。 [强调我的。]

关于忽略额外参数的声明并不像我想说服我在一般情况下这是正确的那样明确。查看TR1,从第 3.6.3 节可以清楚地看出,可以使用与目标对象期望的参数数量不同的参数来调用可调用对象返回。这是最好的保证吗?bind

0 投票
1 回答
2136 浏览

c++ - 使用 std::vector使用 boost::bind

在尝试适应时boost,偶然发现boost::functionstd::vector. 我正在尝试做一件简单的事情:拥有一个具有相似签名的函数列表,然后将所有这些函数与std::for_each样本数据一起使用。这是代码:

因此,for_each我试图将每个函数应用于样本数据的结果写入标准输出。但它不会像这样编译(一些关于结果缺少运算符的长消息<<bind

如果我删除流运算符,那么我将拥有可编译但无用的代码。诀窍是我想在 single 中进行功能应用和文本输出for_each。我错过了什么?认为使用 lambdas 或类似的东西应该很容易,但无法找出正确的解决方案。