Boost::Bind 之placeholders占位符探究

半世苍凉 提交于 2019-12-07 00:52:53

朋友写了一个关于boost::function和boost::bind的代码,却总是编译错误,在网上查了很多资料,不是很明白,遂下决心仔细研究下boost::bind的代码,毕竟也就10几个文件嘛。

在研究的过程中参考了:http://blog.csdn.net/hengyunabc/article/details/7773250的讲解,给了我很大的帮助,非常感谢!但网上的大多数讲解粘贴的模版代码太多,给想了解boost::bind真相的人带来了不必要的阻碍,所以我决定只给大家重点介绍boost::bind中实现的重点,只要明白了这个,实际生产过程中的使用就不会有疑惑了。虽然是简化版本但是还是很多的,所以关于boost::bind的详细解析请参考我的另一篇博文:

Boost::Bind 源码实现简化版

首先粘贴朋友的错误代码:

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}
int main(void)
{
    boost::function0<void> fobj;
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed
    fobj = boost::bind(&fun_2,5);//syntax is ok
    return 0;
}
我们可以先把与boost::function相关的放一边,其实我们可以发现:
boost::bind(&fun_2,_1)();//compile failed

编译报错和上面的情况大同小异,其实问题主要是与boot::bind的占位符的用法有关,所以下面我就用这个例子来分析,最后再回到朋友的问题。

相信到了这里,一切问题都了然了,list0中不存在operator[](boost::argv<1>()重载,当然报错了。

我们回到上面的问题,因为没有查看boost::function源码,但是可以肯定的是boost::function<void ()>中的void()声明的作用肯定会生成一个list0,所以导致了这个错误。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!