std::bind绑定一个引用参数
绑定如下函数:
其中os参数是引用
且流对象(istream/ostream/…)都无法被拷贝和复制,只能以引用的方式作为参数传递
void writeIntoStream(std::ostream& os, const std::string& str, char c)
{
os << str << c;
}
int main()
{
std::vector<std::string> vec = { "aaa", "bbbbbbbb", "ccccccc", "dd", "hhhhhhhhh" };
// 解决std::bind无法绑定一个引用作为参数:
std::filebuf fb;
fb.open("test.txt", std::ios::out); // 以writeOnly的方式打开文件
std::ostream os(&fb); // 实例化一个流对象
// std::ostream os1 = os; 错误 流对象无法被赋值 也不能进行拷贝构造
if (!os.good()) // 检查流对象的状态
{
fb.close();
return -1;
}
// 为for_each传递一个一元谓词(只能接受一个参数)
// 如下代码中的writeIntoStream的第一个参数是引用std::ostream& bind函数无法绑定一个引用参数 会报错 而流对象又无法被复制 只能使用引用
// auto fun = std::bind(writeIntoStream, os, std::placeholders::_1, ' '); 错误 **因为占位符无法替代一个引用**
// 此时可以使用std::ref 实例化一个ref对象 该对象包含给定的引用 且该对象可以拷贝
auto fun = std::bind(writeIntoStream, std::ref(os), std::placeholders::_1, ' ');
std::for_each(vec.begin(), vec.end(), fun);
fb.close();
// std::cref的对象可以包含一个const的引用
return 0;
}
其他需要注意的:bind函数绑定非静态成员函数时,第一个参数需要为该类的类对象
// bind函数绑定成员函数:
std::bind(&ClassFun::fun, classObject, argList or std::placeHolders…) // 注意绑定非静态成员函数时 第一个参数为该类的对象