【发布时间】:2012-06-29 01:55:47
【问题描述】:
我最近在使用 boost::bind 时遇到了代码中的错误。
来自 boost::bind 文档:
bind 接受的参数由返回的函数对象在内部复制和保存。
我假设所持有的副本的类型基于函数的签名。不过实际上是根据传入的值的类型来的。
在我的例子中,发生了隐式转换,将绑定表达式中使用的类型转换为函数接收到的类型。我期待这种转换发生在绑定的位置,但是当使用生成的函数对象时会发生这种情况。
回想起来,我应该能够从以下事实中弄清楚这一点
我的问题是: 为什么 boost::bind 会这样工作?
- 它似乎给出了更糟糕的编译器错误消息
- 当发生隐式转换并且对函子有多次调用时,它似乎效率较低
但鉴于 Boost 的设计非常好,我猜这是有原因的。它是从 std::bind1st/bind2nd 继承的行为吗?是否有一个微妙的原因为什么这很难/不可能实现?完全不同的东西?
为了测试第二个理论,我编写了一个小代码 sn-p,它似乎可以工作,但我可能没有考虑到 bind 的某些特性,因为它只是一个片段:
namespace b = boost;
template<class R, class B1, class A1>
b::_bi::bind_t<R, R (*) (B1), typename b::_bi::list_av_1<B1>::type>
mybind(R (*f) (B1), A1 a1)
{
typedef R (*F) (B1);
typedef typename b::_bi::list_av_1<B1>::type list_type;
return b::_bi::bind_t<R, F, list_type> (f, list_type(B1(a1)));
}
struct Convertible
{
Convertible(int a) : b(a) {}
int b;
};
int foo(Convertible bar)
{
return 2+bar.b;
}
void mainFunc()
{
int x = 3;
b::function<int()> funcObj = mybind(foo, x);
printf("val: %d\n", funcObj());
}
【问题讨论】:
标签: c++ boost boost-bind