天天看點

boost::bind和boost::function使用示例

boost::bind和boost::function使用示例

C++11已支援bind和function,之前的不支援,但可以借助boost達到同樣目的。看如下兩段代碼:

1) 建立HDFS目錄

void hdfs::init()

{

    if (0 == hdfsExists(fs, data_dirpath.c_str()))

    {

        LOG(INFO) 

    }

    else

        if (0 == hdfsCreateDirectory(fs, data_dirpath.c_str()))

        {

            LOG(INFO) 

        }

}

2) 建立本地目錄

void local::init()

    if (0 == access(data_dirpath.c_str(), R_OK | W_OK | X_OK))

        if (0 == hdfsCreateDirectory(data_dirpath.c_str(), S_IRWXU | S_IXGRP | S_IXOTH))

不難看出上述兩段代碼邏輯是一樣的,但是調用的函數名不同,而且函數的參數清單不同。下面利用boost::bind和boost::function将它們統一成一個實作:

void Xinit(boost::function exist_directory

         , boost::function create_directory)

    if (0 == exist_directory(data_dirpath.c_str()))

        if (0 == create_directory(data_dirpath.c_str()))

    Xinit(boost::bind(&hdfsExists, fs, _1)

        , boost::bind(&hdfsCreateDirectory, fs, _1));

    Xinit(boost::bind(&access, _1, R_OK | W_OK | X_OK)

        , boost::bind(&mkdir, _1, S_IRWXU | S_IXGRP | S_IXOTH));

是不是看起來很舒服了?

1) boost::function

它的模闆參數為函數原型,格式為:函數傳回類型 (參數清單),其中的類型還可以為模闆。

2) boost:bind

它可以帶多個參數,第一個參數總是為函數位址,如果為非類成員函數,則後面跟參數清單,如果是類成員函數,則第二個參數為類對象的位址。

其中“_1”和“_2”等,表示參數的占位符,對應于boost::function中的函數原型參數清單。像“fs”和“R_OK | W_OK | X_OK”,一看就知道是咋回事。

有人說可以用它來替代C++中的虛拟函數,而且比虛拟函數更優雅,但我不這麼認同,實際工作中,常常兩者結合使用,以達到簡化代碼的目的。

繼續閱讀