参数绑定(std::bind)

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…) // 注意绑定非静态成员函数时 第一个参数为该类的对象
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值