std::bind
C++ 写的少了之后,有一些新特性老式记不住, 这里对std::bind做一个总结
#include <iostream>
#include <thread>
#include <boost/thread/thread.hpp>
#include <boost/bind/bind.hpp>
// 一个很简单的类
class A{
public:
void print(int& a){
std::cout << "ssfdf" << std::endl;
a++;
}
};
int main(){
A a;
int count = 0;
// boost::thread t(boost::bind(&A::print, &a, boost::ref(count)));
// boost::thread t(boost::bind(&A::print, &a, count)); //0
std::thread t(std::bind(&A::print, &a, std::ref(count)));
//std::thread t(std::bind(&A::print, &a, count)); //结束后count为0
t.join();
std::cout << count << std::endl;
}
boost 中的bind和 std中的bind功能是类似的, 如此可以发现, 写代码确实方便了很多很多.
之前写回调都是各种定义函数指针.
值得注意的是: 如果要传引用的话需要用std::ref
还可以这样写回调函数
int main(){
A a;
int count = 0;
auto func = std::bind(&A::print, &a, std::ref(count));
func();
std::cout << count << std::endl;
}
但是返回值是什么呢? 似乎和 std::function<> 有关系, 后面研究出来在补上
int main(){
A a;
int count = 0;
auto func = std::bind(&A::print, &a, std::placeholders::_1);
func(count);
std::cout << count << std::endl;
}
例如还可以使用 std::placeholders::_1 将一个位置占用起来, 调用的时候再传入参数. 是不是觉得特别棒. 具体C++怎么做到的, 那位仁兄知道告诉我一下.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind/bind.hpp>
#include <thread>
class A{
public:
void print(int& a){
std::cout << "ssfdf" << std::endl;
a++;
}
void print1(int& a, int &b , int c){
std::cout << "print1" << std::endl;
a = b + c;
}
};
int main(){
A a;
int count = 0;
auto func = std::bind(&A::print1, &a, std::placeholders::_1, 100, std::placeholders::_2);
func(count, 100);
std::cout << count << std::endl;
}
在A中添加一个新的函数, 通过placeholders::_1占为符号占位,之后再调用的时候再写上.中间是可以间隔参数的哦. 牛逼~~