boost::function 소개

15491 단어 function
이 글은 주로 boost::function의 용법을 소개한다.boost::function은 함수 패키지 (function wrapper) 로 함수 대상을 정의합니다.

1. 소개


    Boost.Function 라이브러리는 클래스 패밀리의 함수 객체에 대한 패키지를 포함합니다.그것의 개념은 광의적인 리셋 함수와 매우 비슷하다.함수 바늘과 같은 특성을 가지고 있지만 호출된 인터페이스를 포함하고 있다.함수 바늘은 지방에서 호출되거나 리셋 함수로 사용할 수 있다.boost.함수 바늘을 대체하고 더 큰 유연성을 제공할 수 있습니다.

2. 사용


    Boost.Function에는 다음과 같은 두 가지 형식이 있습니다.
기본 설정 형식
휴대용 형식
boost::functionf
boost::function2f
그러나 휴대용 형식은 모든 컴파일러가 지원하는 것이 아니기 때문에 여기에서 나는 첫 번째 형식만 소개한다.

2.1 일반 함수


우리는 다음과 같은 예를 볼 수 있다.

  
    
1 void do_sum( int * values, int n)
2 {
3 int sum( 0 );
4 for ( int i = 0 ; i < n; ++ i)
5 {
6 sum += values[i];
7 }
8 cout << sum << endl;
9 };
10 int _tmain( int argc, _TCHAR * argv[])
11 {
12 boost::function < void ( int * values, int n) > sum;
13 sum = & do_sum;
14 int a[] = { 1 , 2 , 3 , 4 , 5 };
15 sum(a, 5 );
16 return 0 ;
17 }

sum는 광범위한 함수 대상으로 이해할 수 있습니다. 함수 do_만 저장합니다.sum, 그리고 다시 호출합니다.

2.2 구성원 함수


많은 시스템에서 클래스의 구성원 함수에 대한 리셋은 특수한 처리를 해야 한다.이 특수한 처리는 바로 매개 변수 귀속이다.물론 이것은 우리가 토론한 범위를 넘어섰다.boost:::function 구성원 함수 사용에 대한 다음 코드를 볼 수 있습니다.

  
    
1 class X{
2 public :
3 int foo( int a)
4 {
5 cout << a << endl;
6 return a;
7 }
8 };
9 int _tmain( int argc, _TCHAR * argv[])
10 {
11 boost::function < int (X * , int ) > f;
12 f = & X::foo;
13 X x;
14 f( & x, 5 );
15 return 0 ;
16 }

우리는 클래스의 구성원 함수에 대한 대상화는 문법에서 큰 차이가 없다는 것을 발견했다.

3. 전형적인 예


위의 몇 가지 예는 boost::function의 작용을 나타내지 못했는데 여기에 예를 하나 쓰고 있다.예를 들어 프로그램이 어느 곳에 실행될 때 어떤 함수를 귀속하고 싶지만 바로 실행하고 싶지 않으면 우리는 함수 대상을 성명하고 이 대상에 해당하는 함수를 귀속시켜 다른 일을 한 다음에 귀속된 함수를 실행할 수 있다. 코드는 다음과 같다.

  
    
1 void print( int a)
2 {
3 cout << a << endl;
4 }
5 typedef boost::function < void ( int ) > SuccessPrint;
6 int _tmain( int argc, _TCHAR * argv[])
7 {
8 vector < SuccessPrint > printList;
9 SuccessPrint printOne = boost::bind(print, _1);
10 printList.push_back(printOne);
11 SuccessPrint printTwo = boost::bind(print, _1);
12 printList.push_back(printTwo);
13 SuccessPrint printThree = boost::bind(print, _1);
14 printList.push_back(printTwo);
15 // do something else
16 for ( int i = 0 ; i < printList.size(); ++ i)
17 printList.at(i)(i);
18 return 0 ;
19 }

상기 코드에서 먼저 함수 대상 typedef boost::function SuccessPrint를 설명한 다음print를 척도 대상에 귀속시켜vector에 넣고 마지막에야 이 print () 함수를 실행합니다.

좋은 웹페이지 즐겨찾기