Thinking Different




boost::bind

std::bind1st, std::bind2d를 일반화시킨 버전

임의의 함수, 함수 포인터, 함수 객체, 멤버 함수를 함수 객체로 만들 수 있다

원하는 위치에 원하는 값을 (바인딩)전달 시킬 수 있는 함수 객체를 만들어 준다.



기본 boost::bind 사용법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
 
#include <boost/bind.hpp>
#include <boost/ref.hpp>
 
int add(int a, int b)
{
    return a + b;
}
 
void func(int a, int b)
{
    cout << (a + b) << endl;
}
 
void func(int a, int b, std::ostream& os)
{
    os << a + b << endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x = 10;
    int y = 20;
 
    // func(5, 10);
    boost::bind(func, 5, 10)();
    
    // func(10, 20);
    boost::bind(func, _1, _2)(10, 20);
    
    // func(y, x);
    boost::bind(func, _2, _1)(x, y);
 
    // func(y, x, std::cout);
    boost::bind(func, _1, _2, boost::ref(std::cout))(y, x);
    
    // add(5, y);
    cout << boost::bind(add, _1, _2)(5, y) << endl;
 
    return 0;
}







함수 객체 boost::bind 사용법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
 
#include <boost/bind.hpp>
#include <boost/ref.hpp>
 
class test
{
public:
    void operator()(int a, int b, std::ostream &os)
    {
        os << a + b << endl;
    }
 
    int operator()(int a, int b) { return a - b; }
};
 
#include <vector>
#include <algorithm>
 
bool compare(int i, int j)
{
    return i < j;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    // 함수 객체 생성
    test testObj;
 
    int x = 10;
    int y = 20;
    
    // void operator()(int a, int b, std::ostream &os)
    boost::bind<void>(boost::ref(testObj), _1, _2, boost::ref(std::cout))(x, y);
 
    // int operator()(int a, int b)
    int z = boost::bind(boost::type<int>(), boost::ref(testObj), _2, _1)(x, y);
    cout << z << endl;
 
    return 0;
}







boost::bind를 활용한 컨테이너 std::sort 활용법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
 
#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
 
bool compare(int i, int j)
{
    // 오름차순 정렬
    return i < j;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    // 벡터 (정렬되지 않은 데이터 입력)
    vector<int> v{ 1, 3, 2, 4, 6, 5 };
 
    // bind를 활용한 sort
    sort(v.begin(), v.end(), boost::bind(compare, _1, _2));
 
    // 출력 확인
    for (int i : v)
        cout << i << endl;
 
    return 0;
}




'프로그래밍 언어 > boost' 카테고리의 다른 글

Boost.Tuple & std::pair  (0) 2015.05.03
Boost.Function  (0) 2015.05.01
Boost.Ref  (0) 2015.04.30
Boost.Atomic  (0) 2015.04.30
Boost.ScopeExit  (0) 2015.04.28