std::bind函数
bind()接受的第一个参数必须是一个可调用的对象f,可以是函数、函数指针、函数对象和成员函数指针,之后接受的参数的数量必须与f的参数数量相等,这些参数将被传递给f作为入参。
绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动推导为f的返回值类型
bind详细使用
//普通全局函数
void Out( int & elem)
{std::cout << elem << " ";
}//类
template<typename T>
class Print
{
public:Print(const char * prefix = ""): _prefix(prefix), _printNum(0){}//非静态成员函数void PrintElem(const T & elem){_printNum++;if (_printNum <= 1){cout << "\n" << _prefix << ": "; }cout << elem << " ";}//静态成员函数static void static_fun(){std::cout << "\nstatic func!";}
private:string _prefix;size_t _printNum;
};int arr[] = {1,2,1,3,4,8,9,8};
vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
//绑定普通函数
std::for_each(v.begin(),v.end(),std::bind(&Out,std::placeholders::_1));//绑定类的非静态成员函数
//第一个占位符的位置必须是一个类的实例、引用或指针
Print<int> print("bind member function");
std::for_each(v.begin(),v.end(),std::bind(&(Print<int>::PrintElem),&print,std::placeholders::_1));
//注:必须在成员函数前加上取地址操作符&,表明这是一个成员函数指针,否则会无法通过编译。//绑定静态成员函数 与绑定全局函数没有区别
std::function<void(void)> ff = std::bind(&Print<int>::static_fun);
ff();
强调一下在绑定类的非静态成员函数时:
必须在成员函数前加上取地址操作符&,表明这是一个成员函数指针,否则会无法通过编译。
除此之外,因为类的非静态成员函数,隐式地把this作为第一个传参,所以在第一个占位符的位置必须是一个类的实例、引用或指针
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
