
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++中的虛拟函數,而且比虛拟函數更優雅,但我不這麼認同,實際工作中,常常兩者結合使用,以達到簡化代碼的目的。