std::bind 的实现原理

C++11 中有一个非常神奇的函数std::bind,它让你可以对函数进行适配,动态的绑定参 数。比如你有一个函数接收两个参数,一个算法接收单参数的callable object,那么通 过std::bind我们可以让两者协同工作。

void Foo(int a, int b);

template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

std::vector<int> v;
int b = 10;
for_each(v.begin(), v.end(), std::bind(Foo, _1, b))

那么这个神奇的 bind 函数和神奇的占位符到底是怎么实现的呢,它们的工作原理是什么 ?这个问题困扰我很久,最近在网上找到一篇讲解非常清晰的文章,这里对其中的 内容做简单的摘要和翻译,希望对于大家理解背后的工作原理会有帮助。

bind 是一个工厂方法

很显然 bind 是一个工厂方法,因为我们传递给 for_each 的是 bind 的返回值而不是 bind 本身。bind 创建的对象在 boost 实现中叫做 bind_t。因为 bind 要做的事情是适配 器,所以它返回的对象必然和它接受的对象是一样的—— callable object。因此,bind_t 中必然重载了函数调用符。

class bind_t {
public:
    template<typename A>
    operator()(A a);
};

此外,bind_t 需要以用户给定的参数调用原本的函数,所以它的内部实际还存储了另外两 个成员,也就是原本的函数和用户已经确定的参数。

template <typename F, typename L>
class bind_t {
    F f_;
    L l_;
public:
    bind_t(F f, L l) : f_(f), l_(l) {}

    template<typename A>
    operator()(A a);
};

参数

对于std::bind来说,参数分为两种,一种是用户创建bind_t的时候提供的,另一种是 调用 bind_t 的operator()()的时候提供的,前者在创建 bind_t 的时候就已经知道,而 后者是在调用bind_toperator()()的时候才知道,为了方便描述我们把它们分别叫做 L 和 A 。

很显然,L 和 A 都可能有多个,多个 A 可以通过重载不同版本的 operator() 来解决,比 如:

template <typename F, typename L>
class bind_t {
    F f_;
    L l_;
public:
    template<
  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值