Boost::Bind 之placeholders佔位符探究

朋友寫了一個關於boost::function和boost::bind的代碼,卻老是編譯錯誤,在網上查了不少資料,不是很明白,遂下決心仔細研究下boost::bind的代碼,畢竟也就10幾個文件嘛。 .net

在研究的過程當中參考了:http://blog.csdn.net/hengyunabc/article/details/7773250的講解,給了我很大的幫助,很是感謝!但網上的大多數講解粘貼的模版代碼太多,給想了解boost::bind真相的人帶來了沒必要要的阻礙,因此我決定只給你們重點介紹boost::bind中實現的重點,只要明白了這個,實際生產過程當中的使用就不會有疑惑了。雖然是簡化版本可是仍是不少的,因此關於boost::bind的詳細解析請參考個人另外一篇博文: code

Boost::Bind 源碼實現簡化版

首先粘貼朋友的錯誤代碼: blog

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的佔位符的用法有關,因此下面我就用這個例子來分析,最後再回到朋友的問題。 get

相信到了這裏,一切問題都瞭然了,list0中不存在operator[](boost::argv<1>()重載,固然報錯了。 源碼

咱們回到上面的問題,由於沒有查看boost::function源碼,可是能夠確定的是boost::function<void ()>中的void()聲明的做用確定會生成一個list0,因此致使了這個錯誤。 io

相關文章
相關標籤/搜索