• boost之bind


    bind1st bind2nd在stl里面有具体的实现,只是只能绑定两个参数。

    boost里面的bind使用bind(Fun f,A1 a1,A2,a2...)产生一个对象,这个对象可以有占位符,可以等到调用函数对象的时候传递参数进去即通过bind b(..);b(args);

    bind绑定参数是通过存储值的形式,如果对象很大,需要耗费很大的代价,可以用ref,但是bind是延后处理的,需要保证所引用的对象在调用之前不被释放。

    一.绑定普通函数

    #include <iostream>
    #include <string>
    #include <boost/algorithm/string.hpp>
    using namespace std;
    using namespace boost;
    
    int f(int a,int b)
    {
     return a+ b;
    }
    
    int g(int a,int b,int c)
    {
    	return a + b *c;
    }
    
    int main()
    {
    	cout << bind(f,1,2)()<<endl;
    	cout << bind(g,1,2,3)() <<endl;
    	return 0;
    }
    

     二.绑定成员函数

    由于成员函数需要对象才能调用,所以需要占用bind的一个参数位置。

    #include <iostream>
    #include <string>
    #include <boost/algorithm/string.hpp>
    #include <boost/bind.hpp>
    using namespace std;
    using namespace boost;
    
    struct demo
    {
    	int f(int a,int b)
    	{
    		return a+ b;
    	}
    };
    
    
    
    
    int main()
    {
    	demo a,&ra =a;
    	demo *p = &a;
    	cout << bind(&demo::f,a,_1,20)(10)<<endl;
    	return 0;
    }
    

     三.通过for_each迭代传递对象给bind,循环调用被适配的成员函数。

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/algorithm/string.hpp>
    #include <boost/bind.hpp>
    using namespace std;
    using namespace boost;
    
    struct demo
    {
    	void  print()
    	{
    		cout  << "Hello"<<endl;
    	}
    };
    
    
    int main()
    {
    	
    	vector<demo> vec(10);
    	for_each(vec.begin(),vec.end(),boost::BOOST_BIND(&demo::print,_1));
    	return 0;
    }
    

    四.绑定成员变量,通过迭代向函数传递参数

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/algorithm/string.hpp>
    #include <boost/bind.hpp>
    using namespace std;
    using namespace boost;
    
    struct demo
    {
    	void  print()
    	{
    		cout  << "Hello"<<endl;
    	}
    	int x;
    };
    
    void print(int x)
    {
    	cout << x <<endl;
    }
    
    int main()
    {
    	demo de;
            de.x=357;
    	vector<demo> vec;
    	for (int i = 0;i < 10;++i)
    	{
    		vec.push_back(de);
    	}
    	
    
    	vector<int> vec2(10);
    	for_each(vec2.begin(),vec2.end(),bind(print,_1));
    	transform(vec.begin(),vec.end(),vec2.begin(),bind(&demo::x,_1));
    	for_each(vec2.begin(),vec2.end(),bind(print,_1));
    	return 0;
    }
    
  • 相关阅读:
    第一次个人编程作业
    第一次博客作业
    20175311 2018-2019-2 《Java程序设计》第五周学习总结
    2018-2019-2 20175311 实验一《Java开发环境的熟悉》实验报告
    20175311 2018-2019-2 《Java程序设计》第四周学习总结
    团队项目-选题报告
    第二次结队编程作业
    第一次结对编程作业
    第1组 团队展示(组长)
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3254315.html
Copyright © 2020-2023  润新知